深入解析指针操作与类型区别
一*p a 默认 p是指针 a是变量a、a、p、*p、*(p)、*(a)、(*p)、(*a)a变量a取变量a的地址p指向a的地址*p指向a的地址的值*(p)先取p的地址后再解引用*(p)等价于p*(a)先取a的地址后再解引用*(a)等价于a(*p)先对p解引用回a后再取地址(*p)等价于p(*a)先对a解引用后再取地址但默认a是常量故此写法为非法二*p、*(p)、(*p)、*p、*p*pint *p可写作int* p即p为int*类型p又是指向a的地址p表示a的地址后置自增1若int main() { int arr[3] {1,2,3}; int *p arr; int a *p; int b *p; printf(%d %d,a,b); return 0; };运行到第3行时p指向arr首地址arr[0]运行到第5行时p指向arr[1]即地址自增1但b却为1结论*p运行时会先取当前所指向的值arr[0]1作为表达式的结果(a1)后地址自增1即p指向arr数组第二个元素*(p)int main() { int arr[3] {1,2,3}; int *p arr; int a *p; int b *(p); printf(%d %d,a,b); return 0; };结论*p等价于*(p)(*p)*p本身就是p所指向的值此可类比为aint main() { int arr[3] {1,2,3}; int *p arr; int a *p; int b (*p); printf(%d %d,a,b); return 0; };结论(*p)执行时也会取当前指向地址的值arr[0]1但并不会改变地址的指向只是会更新此地址原本的数值1变2*p注意可知*p等价于(*p)进一步类比为a。先自增后取值不会改变指向的地址int main() { int arr[3] {1,2,3}; int *p arr; int a *p; int b *p; printf(%d %d,a,b); return 0; };*p先自增p的地址后取新地址的数值三XX指针、指针XXXX指针本质是指针如常量指针const int* p; 可改指向内容不可修改函数指针void (*fun)(); 存放函数入口地址用以调用函数数组指针int (*p)[];指向整个数组的指针存储数组首地址指针XX本质是XX如指针常量int* const p; 本质是常量则内容不可修改但指向内容可以修改指针函数void* fun();本质是函数返回值为指针类型指针数组int* p[];本质是数组每个元素都是指针