黑马程序员技术交流社区
标题:
学完了所有的指针 理一下思路
[打印本页]
作者:
普通蜗牛
时间:
2015-8-2 17:12
标题:
学完了所有的指针 理一下思路
//
// 指针总结.h
// 0730代码实践
//
// Created by apple on 15-7-30.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#ifndef _730__________h
#define _730__________h
#endif
指针跟各种类型数据的结合分类
#warning---------->>>>>>>>>>>普通指针<<<<<<<<<<<<<<--------------
分为一级指针和二级指针
*******************************************************
----------------------指针概念与定义方法
1、指针变量
用来存放地址的变量,就是指针变量
2、指针?
就是地址
3、指针变量的定义
数据类型 *指针变量名;
int *p; //定义了一个指针变量,变量名是p
//int表示,p只能存放一个int类型的变量的地址
char *p1; //定义了一个指针变量,变量名是p1
//p1只能存放一个char类型数变量的地址
int num=10;
char *p = # //警告
4、指针变量定义的注意事项
1)“*” 必须得有,如果没有就相当于定义一个普通变量
2)指针变量能用来存放数值或者字符之类的吗? 不能
3)指针变量,归根结底还是变量,也有全局和局部变量之分
----------------------指针变量初始化和引用
指针变量也是变量
指针变量的使用: 定义指针变量 ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)
指针变量如果不初始化会有什么后果?
结论:如果一个指针变量定义以后,如果不进行初始化
这个指针变量存放的事一个垃圾数,这个指针变量,称之为 野指针
一定要避免操作野指针,因为可能会带来意向不到的错误
int *p10; //值是一垃圾值,有可能存放是系统程序的地址
*p10 = 438; //可能会造成系统崩溃
*******************************************************
两个指针变量之间的运算
1)两个指针之间的减法运算
(1)0x0006 - 0x0003 = 3 (意义不大)
(2)常见的用法:两个指针都指向同一个数组
i.判断两个指针变量指向的元素是否连续
ii.判断两个指针变量之间相隔几个元素
int a[5]={1,2,3,4,5};
int *p = a; //p指向了数组的第一个元素
int *p1 = &a[3]; //p指向了数组的第四个元素
注意:两个指针变量之间没有加法运算
2)两个指针之间的关系运算
// p1 > p
//1 表示p1在高位
//0 p在高位或者他们指向了同一个位置
二级指针:如果一个指针变量存放的是另一个指针变量的地址,则称此指针变量为二级指针
int *p=&a;int **p1=&p;
指针为什么要区分类型?
不同类型的指针变量在内存中占用8个字节
为什么都占用8个字节还要区分类型呢?
//如果定义指针变量不定义类型,那么它在取*也就是在取其中的值的时候,就不知道应该读取几个字节,而定义了类型之后,如果是Int类型的就读四个字节,char类型的就读一个字节。
#warning---------->>>>>>>>>>>指针与数组<<<<<<<<<<<<<<--------------
数组指针 与指针数组,其中数组指针有分为一维数组指针 和二维数组指针
*******************************************************
数组指针:
指向数组元素的指针
数组指针的作用:
使用数组指针间接访问数组的元素
数组指针的定义:
int *p;
数组指针的初始化:
int a[4]={1,2,3,4};
int *p = a; //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素
int *p = &a[0]; //等价上面一句话
数组指针如何访问数组的元素:
1)p+1 表示指向数组的下一个元素
2)p-1 指向数组的上一个元素
使用数组指针和使用数组名的区别
p = p+1
*p++
// p是一个指针变量,既然是一个变量,它存放的值是可以改变的
printf(" *p++ = %d\n",*p++);
printf(" *p = %d\n",*p);
//学习的误区: 数组名 a是一个常量 *(10++)
//数组名++ 这是错误的
//printf(" *a++ = %d\n",*a++); //错误的
printf(" *a = %d\n",*a);
*******************************************************
二维数组指针
行指针,用来指向二维数组的每一行,存放的是行的首地址
定义格式: 数据类型 (*行指针变量名)[数组第二维的长度];
二维数组指针的初始化
int a[2][3];
int b[2][2];
float f1[4][4];
//假设我要定义一个指向数组a的一个行指针
// a = &a[0] = &a[0][0] = a[0]
int (*p)[3] = a;
二维数组指针的使用
*(*(p+i)+j) //就是获取二维数组的每个元素
int arr[2][3] = {1,4,7,2,5,8};
int (*p)[3] = arr;
/*
p是一个指向二维数组的指针,所以他存放的相当于数组名,也就是第一行地址
p+i 就代表着第i行的第一个元素的地址
*p 就代表着第一行第一个元素的地址
*(p+i) 就代表着第i行的对应的内容(第一个元素的地址) *(p+i) == a[i]
*(p+i)+j 就代表着第i行的第j个元素的地址
*(*(p+i)+j) 就代表着第i行的第j个元素的地址所对应的值
*/
a[0][0]=0x7fff5fbff810 a[0][1]=0x7fff5fbff814 a[0][2]=0x7fff5fbff818
a[1][0]=0x7fff5fbff81c a[1][1]=0x7fff5fbff820 a[1][2]=0x7fff5fbff824
p = 0x7fff5fbff810 指向二维数组的第一个元素(第一行地址)的地址
p+1 = 0x7fff5fbff81c 第二行地址
*p = 0x7fff5fbff810 第一行第一个元素的地址
*p+1 = 0x7fff5fbff814 第一行第二个元素的地址
**p = 1 第一行第一个元素的地址所对应的值
*******************************************************
指针数组:
存放指针的数组,就是指针数组
指针数组的定义:
数据类型 * 数组名[数组长度];
int *pa[3];
//定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针)
指针数组的使用:
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
pa[0] a的地址
pa
int arr[10] ={1,23};
int *p
double *p1;
指针数组
int arr[2][3] = {1,4,7,2,5,8};
int *pa[2] = {arr[0],arr[1]};
a[0][0]=0x7fff5fbff810 a[0][1]=0x7fff5fbff814 a[0][2]=0x7fff5fbff818
a[1][0]=0x7fff5fbff81c a[1][1]=0x7fff5fbff820 a[1][2]=0x7fff5fbff824
&pa = 0x7fff5fbff800 指针数组的地址
pa = 0x7fff5fbff800 指针数组的数组名,指向数组第一个元素的地址&pa[0]
&pa[0] = 0x7fff5fbff800 第一个元素的地址
*pa = 0x7fff5fbff810 *&pa[0]指向数组第一个元素的地址所对应的内容
pa[0] = 0x7fff5fbff810 指向数组第一个元素的地址所对应的内容
*pa[0]=1 * arr[0] 也就是二维数组第一个元素的值
*******************************************************
#warning---------->>>>>>>>>>>指针与字符串<<<<<<<<<<<<<<--------------
字符串指针:
定义: char *字符串指针变量名 = "字符串内容";
用作:用来保存一个字符串
char *str = "zfbanzhang zaiyiqi";
//"zfbanzhang zaiyiqi" 这个字符串存储在常量去
//str 只保存了字符串常量的首地址
str = "I LOVE YOU";
//str是指针变量
//str重新指向另外一个字符串常量 "I LOVE YOU"
//保存的是 "I LOVE YOU" 字符串常量的首地址
#warning---------->>>>>>>>>>>指针与函数<<<<<<<<<<<<<<--------------
*******************************************************
指针函数:
返回值是指针的函数
指针函数的定义
指针类型 * 函数名(){
return 地址;
}
*******************************************************
函数指针变量
存放函数的首地址的指针变量就是函数指针变量
函数指针变量的定义
返回值类型 (*变量名)(函数的参数);
函数的声明:
int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
//定义了一个函数指针 p1
//p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
//函数指针的初始化
p1 = sum; //sum存的就是函数在内存中的首地址
//注意:定义函数指针的时候,可以不用写形参名
int (*p1)(int ,int );
函数指针的使用
int sum(int x,int y){
return x+y;
}
//1、定义函数指针
int (*p)(int ,int );
//2、给函数指针初始化
p = sum; //p也指向了sum函数
//3、用函数指针间接的调用函数
// (*p)(23,45);
int s = p(23,45);
作者:
我丶就这样
时间:
2015-8-2 19:58
很详细!!!
作者:
qq103613
时间:
2015-8-2 20:01
我是来顶贴的、、、、、
作者:
1312878967
时间:
2015-8-2 21:35
厉害 厉害 厉害 厉害 真厉害
作者:
15133444432
时间:
2015-8-2 22:27
努力的学。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2