指针

来源:互联网 发布:门诊电子处方软件 编辑:程序博客网 时间:2024/06/14 11:14
char **p,a[16][8];p=a;会导致程序在以后出现问题吗?为什么?p[1][2]和a[1][2]代表一样的意思吗?p=a;如果a[1][2]=1;那么p[1][2]的值是多少?p[1][2]=*(*(p+1)+2)=*(*((char**)&a[0][4])+2);*(p+1)实际上就是a[0][4],a[0][5],a[0][6],a[0][7]等四个元素组成的地址数据,然后对此数据加2,最后访问该地址的内容,而a[0][4],a[0][5],a[0][6],a[0][7]是随机值,因此肯能出现段错误

指针是一种特殊的变量,与整数的运算规则为:
int* p;
p+n; == (unsigned int)p + n*sizeof(*p)

数组名可以看做是指向数组第一个元素的常量指针,但它并不是指针

指针之间只支持减法运算
只有当两个指针指向同一个数组的元素时,指针相减才有意义,其意义为指针所指元素的下标差

指针之间也可以进行关系运算(<, <=, >, >= )
关系运算的前提是同时指向同一个数组中的元素

任意两个指针之间的比较运算(==,!=)无限制
参与比较运算的指针类型必须相同

a为数组首元素的地址
&a为整个数组的地址
a和&a的区别在于指针运算

数组作为函数参数时,编译器将其编译成对应的指针
void f(int a[]); == void f(int* a);
void f(int a[5]); == void f(int* a);
一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来表示数组的大小

指针阅读技巧:
右左法则:
- 从最里层的圆括号中未定义的标示符开始
- 首先向右看,再往左看
- 遇到圆括号或方括号时可以确定部分类型
- 重复2,3步骤,知道结束

int (\*p2[5])(int\*);//p2是数组,数组有5个元素,5个元素是指针,指向函数,函数类型为int (int*)int\* (\*(\*p4)(int\*))(int \*);//p4是指针,函数指针,函数参数是int*,返回值是指针,是函数指针,指向的函数类型int (int\*)

野指针:不是NULL指针,指针变量中的值是非法的内存地址

基本原则:
- 绝不返回局部变量和局部数组的地址;
- 任何变量在定以后必须初始化为0
- 字符数组必须确认’\0’结束符才能成为字符串
- 任何使用与内存操作相关的函数必须指定长度信息
- 结构体成员指针必须初始化

原创粉丝点击