指针初始化区别 | |
对普通变量 |
对数组 |
int a;
int *p = &a; |
int a[8];
int *p = a; |
int a;
int *p;
p = &a; |
int a;
int *p;
p = a; |
|
指针类型 |
指针所指类型 |
|
去掉指针名剩下部分 |
去掉 *和指针名后剩下部分 |
int *p |
int * |
int |
int **p |
int ** |
int * |
int (*p)[8] |
int (*)[8] |
int ( )[8] |
int *p[8] |
int *[8] |
int [8] |
int *(*p)[8] |
int *(*)[8] |
int *( )[8] |
void *p |
void(空类型) |
不指向任何类型 |
int a[20];
int *p = a; | |
求地址 |
求内容(值) |
a = (a+0) = &a[0] = (p+0) = &p[0] |
a[0] = *(a+0) = p[0] = *(p+0) = *p |
(a+1) = &a[1] = (p+0) = &p[1] |
a[1] = *(a+1) = p[1] = *(p+1) |
(a+i) = &a[i] = (p+i) = &p[i] |
a[i] = *(a+i) = p[i] = *(p+i) |
int a[10] = {1, 3, 5, 7, 9, 11 } ;
int * p = a ; | ||||||
原型 |
第1步 |
第2步 |
p变否 |
备注 | ||
p++ |
先取p所指地址 |
先p |
再指向数组下个元素地址 |
再p+1 |
p值改变 |
不能写成a++ |
先求&a[0]
|
求地址 |
再指向a[1],结果为&a[1] |
结果为地址 | |||
*p++ |
先取p所指内容(值) |
先*p |
再指向数组下个元素 |
再p+1 |
p值改变 |
不能写成*a++ |
先求a[0]
|
求值 |
再指向a[1],结果为&a[1] |
结果为地址 | |||
(*p)++ |
先取p所指内容(值) |
先*p |
再将该值加1 |
再*p+1 |
p值不变 |
可以写成(*a)++ |
先求a[0] |
求值 |
再将a[0]内容加上1,即为1+1=2 |
结果为值 |