[英]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);
}
我不明白的是,如果我们将int *a[]
作为指针数组传递,那么它应该是一个数组,好吗? 但有人告诉我,这里a只是一个作为x别名的指针变量,但根据语法a应该是一个数组,即。 print()
function 的激活记录应该包含一个数组,而不仅仅是一个保存x基地址的指针变量,而是整个混淆是指针还是指针数组,语法肯定表明它应该是一个数组int
指针,我在网上阅读但更加困惑,请不要通过标记无关来忽略这个问题。
在两种情况下,数组“衰减”为指向其第一项的指针:
原因int *x[] = {a1,a2,a3};
工作是因为那些 3 arrays “衰减”成指向它们的第一个元素的指针。 在所有 3 种情况下都是int*
类型,因此它与x
数组的元素类型兼容。
然后,当您定义 function (例如void print (int *a[])
时,编译器会默默地隐式地将这个数组声明“衰减”为指向第一个元素的指针。 int* []
数组的第一个元素是int*
,指向一个元素的指针是int**
。 所以这个 function 相当于void print (int** a);
. 这就是为什么我们可以在这里写一个空的[]
- 编译器并不关心数组的大小,因为它无论如何都会用指针替换数组。
这也是多级间接a[0][2]
起作用的原因。 这不是因为a
是一个二维数组——它不是。 但是第一个[]
对int**
类型进行指针运算以获取相关的int*
元素。 第二个依次对该指针元素进行指针运算,以得到实际的int
。
至于 function 里面的各种行,这是某种人工学校示例,旨在教授运算符优先级。 提示:后缀运算符通常具有最高优先级。
a[-1][1]
行是一个错误,因为它调用了未定义的行为——我们不应该编写这样的程序,其原因是它自己的一个有点高级的话题。 此处的详细信息:仅将指针指向数组边界之外而不取消引用它是未定义的行为吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.