如何获取数组指针的地址?C语言数组地址赋值给二级指针报错问题咨询
为什么
int **pp = &arr;会报错?你的理解误区和解决方法 首先直接点出核心问题:你的误解源于对数组名arr的类型认知偏差,咱们一步步拆解清楚:
1. 先搞懂各个表达式的真实类型
arr本身的类型是int[8](8个int元素的数组),在大多数表达式场景里(比如赋值给int*变量时),它会隐式退化为指向数组首元素的指针,也就是int*类型,但它本质不是指针,只是临时做了转换。&arr的类型是int (*)[8]——这是一个数组指针,指向的是整个int[8]类型的数组,而非指向指针的指针。int**是二级指针,它的作用是指向一个int*类型的变量(也就是一个指向int的指针)。
这两种类型完全不兼容,C语言不允许这种隐式类型转换,所以编译器会抛出错误。
2. 纠正你的关键误解:arr不是“指向int数组的指针”
你误以为arr是指向数组的指针,但实际情况是:
arr是数组本身,退化为指针时,指向的是数组的首元素(类型是int*),而非整个数组。- 只有
&arr才是指向整个数组的指针,类型是int (*)[8],和int**没有任何关联。
3. 实现需求的两种可行方法
根据你的实际需求,分两种场景给出解决方案:
场景1:确实需要使用二级指针int**
如果你的目标是用二级指针间接操作数组,需要先创建一个中间的int*变量,让它指向数组首元素,再把这个变量的地址赋值给pp:
int arr[8] = {1, 2, 3, 4, 5, 6, 7, 8}; int *p = arr; // p是指向数组首元素的int*类型指针 int **pp = &p; // pp指向p,类型完全匹配,合法 // 访问数组元素示例: printf("%d\n", **pp); // 输出arr[0] = 1 printf("%d\n", *(*pp + 4)); // 输出arr[4] = 5
场景2:直接用数组指针(更贴合你取数组地址的初衷)
如果你本来就是想获取整个数组的地址,那应该把pp的类型改成数组指针,而非二级指针:
int arr[8] = {1, 2, 3, 4, 5, 6, 7, 8}; int (*pp)[8] = &arr; // 类型完全匹配,合法 // 访问数组元素示例: printf("%d\n", (*pp)[0]); // 输出1 printf("%d\n", (*pp)[7]); // 输出8
这里(*pp)是解引用数组指针,得到整个数组,再用[索引]就能访问对应元素。
内容的提问来源于stack exchange,提问作者kjhhgt76
相关产品推荐
相关产品推荐

