繁体   English   中英

在 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);
}

我不明白的是,如果我们将int *a[]作为指针数组传递,那么它应该是一个数组,好吗? 但有人告诉我,这里a只是一个作为x别名的指针变量,但根据语法a应该是一个数组,即。 print() function 的激活记录应该包含一个数组,而不仅仅是一个保存x基地址的指针变量,而是整个混淆是指针还是指针数组,语法肯定表明它应该是一个数组int指针,我在网上阅读但更加困惑,请不要通过标记无关来忽略这个问题。

在两种情况下,数组“衰减”为指向其第一项的指针:

  • 每当在(大多数)表达式中使用数组名称时,或
  • 当 function 参数声明为数组类型时。

原因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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM