C语言指针概念详解:数组指针与二级指针的本质区别
前言最近考研复试在复习C语言突然看到以前初学时没有深究的一个知识点数组指针与指针数组int (*p)[5] vs int *p[5]之前一直以为这它们虽然一个本质是指针一个本质是数组但是二者同为二级指针可以相互转换。今天查阅资料并与AI深度交流才终于弄懂二者的区别。先说结论数组指针本质是仍然是一级指针虽然数组指针指向数组数组名在某些场景如函数可以退化为指针但是数组虽然会退化但本身不是指针变量。而指针数组它本质是一个数组每个数组元素存储一个变量地址且指针数组在函数参数其实就等价为二级指针。更多补充指针数组vs数组指针即各自函数传参因此探讨的核心即为数组指针与二级指针的本质区别核心问题为什么char (*p)[5]不是二级指针你的困惑很有代表性关键在于理解数组名的双重身份和指针指向的目标类型。让我们一步步拆解1. 数组名的双重身份数组名在C语言中有两个不同的身份身份1数组整体的标识符char arr[5] hello; printf(arr %p\n, arr); // 数组整体的地址类型char (*)[5]arr是整个数组的地址类型是char (*)[5]指向长度为5的char数组的指针这是一个具体的内存位置可以被存储在数组指针中身份2数组首元素的地址数组名退化char arr[5] hello; printf(arr %p\n, arr); // 首元素地址类型char* printf(arr[0] %p\n, arr[0]); // 和上面完全相同当数组名单独使用时如作为函数参数会自动退化为指向首元素的指针此时arr等价于arr[0]类型是char*2. 关键数组指针指向的是什么char arr[3][5] {abc, def, ghi}; char (*p)[5] arr; // arr退化后是 char (*)[5] 类型分析p的指向p存储的是arr[0]第一行数组的地址arr[0]是一个长度为5的char数组不是指针变量因此p是一个指向数组的指针不是指向指针的指针内存布局对比情况1二维数组char arr[3][5]内存中是连续的字符序列地址 | 0x100 | 0x101 | 0x102 | 0x103 | 0x104 | 0x105 | 0x106 | ... 内容 | a | b | c | \0 | ? | d | e | ... |---- arr[0] ----| |---- arr[1] ----|arr[0]是数组不是指针变量p指向arr[0]的起始地址情况2指针数组char *arr[3]内存中是指针变量的数组地址 | 0x100 | 0x101 | 0x102 | 0x103 | 0x104 | 0x105 | 0x106 | ... 内容 | 0x200 | 0x210 | 0x220 | ? | ? | ? | ? | ... |---- arr[0] ----| |---- arr[1] ----|arr[0]是指针变量存储字符串的地址如0x200char **p arr中p指向arr[0]指针变量3. 为什么char (*p)[5]不是二级指针二级指针的定义是指向指针变量的指针反证法如果char (*p)[5]是二级指针那么*p应该是一个指针变量**p应该能访问到最终数据但实际情况char arr[3][5] {abc, def, ghi}; char (*p)[5] arr; printf(*p %p\n, *p); // *p 是 arr[0]第一行数组的地址 printf(**p %c\n, **p); // **p 等价于 *(*p 0) *arr[0] arr[0][0] a*p不是指针变量而是arr[0]数组的地址**p访问的是arr[0][0]第一个字符不是通过两次解引用指针变量4. 总结本质区别| 指针类型 | 存储的地址 | 指向的目标类型 | 是否是二级指针 | |---------|------------|---------------|---------------| |char **p| 指针变量的地址 |char*指针 | ✅ 是 | |char (*p)[5]| 数组的地址 |char[5]数组 | ❌ 不是 |核心结论二级指针的关键是「指向指针变量」数组指针指向的是「数组」数组虽然会退化但本身不是指针变量判断是否为二级指针要看指向的目标类型而不是语法结构或数组名的退化特性记住数组名的退化是C语言的语法规则但这并不改变数组本身的类型。数组指针指向的始终是数组而不是指针变量。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417060.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!