提问人:Pawan Nirpal 提问时间:5/10/2021 最后编辑:Pawan Nirpal 更新时间:5/10/2021 访问量:142
在 C 语言中传递指针数组是什么意思?
What does it mean to pass an array of pointers in C?
问:
我正在为 C 的指针概念而苦苦挣扎,确切地说是指针数组。请参阅以下程序以供参考。
#include <stdio.h>
int a1[] = {6,7,8,18,34,67};
int a2[] = {23,56,28,29};
int a3[] = {-12,27,-31};
int *x[] = {a1,a2,a3};
void print (int *a[]){
printf ("%d",a[0][2]);
printf ("%d",*a[2]);
printf ("%d",*++a[0]);
printf ("%d",*(++a)[0]);
printf ("%d",a[-1][1]);
}
void main (){
print (x);
}
我不明白的是,如果我们作为指针数组传递,它应该是一个数组,好吗?但我被告知,这里的 a 只是一个指针变量,它充当 x 的别名,但根据语法,a 应该是一个数组,即。函数的激活记录应该包含一个数组,而不仅仅是一个包含 x 基址的指针变量,但这就是整个混淆,它是一个指针还是一个指针数组,语法肯定表明它应该是一个指针数组,我在网上阅读但更加困惑,请不要通过标记不相关来忽视这个问题。int *a[]
print()
int
答:
在两种情况下,数组会“衰减”为指向其第一项的指针:
- 每当在(大多数)表达式中使用数组名称时,或者
- 当使用数组类型声明函数参数时。
之所以有效,是因为这 3 个数组“衰减”为指向它们的第一个元素的指针。在所有 3 种情况下,它都是 类型 ,因此它与数组的元素类型兼容。int *x[] = {a1,a2,a3};
int*
x
然后,当您定义一个函数(如 )时,编译器会以静默方式隐式地将此数组声明“衰减”为指向第一个元素的指针。数组的第一个元素是 ,指向一个元素的指针是 。所以这个函数等价于 。这就是为什么我们可以在这里写一个空 - 编译器不关心数组大小,因为它无论如何都会用指针替换数组。void print (int *a[])
int* []
int*
int**
void print (int** a);
[]
这也是多层次间接起作用的原因。这并不是因为是 2D 数组 - 它不是。但第一个对类型进行指针算术以获取相关元素。第二个依次对该指针元素进行指针算术运算,以得到实际的 .a[0][2]
a
[]
int**
int*
int
至于该函数内部的各种行,它是某种人为的学校示例,旨在教授运算符优先级。提示:后缀运算符通常具有最高的优先级。
该行是一个错误,因为它调用了未定义的行为 - 我们不应该编写这样的程序,原因是一个有点高级的话题。详细信息在这里:只是在数组边界之外使指针指向而不取消引用它是否是未定义的行为?a[-1][1]
评论
[]
sizeof(type)
int**
sizeof(int*)
评论
gcc -Wall -Wextra -g
gcc -fverbose-asm -Wall -Wextra -O2 -S your-prog.c
your-prog.s