Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在C中传递指针数组意味着什么?_Arrays_C_Pointers_Parameter Passing - Fatal编程技术网

Arrays 在C中传递指针数组意味着什么?

Arrays 在C中传递指针数组意味着什么?,arrays,c,pointers,parameter-passing,Arrays,C,Pointers,Parameter Passing,我正在努力解决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]

我正在努力解决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 a1[]={6,7,8,18,34,67};
int a2[]={23,56,28,29};
int a3[]={-12,27,-31};
int*x[]={a1,a2,a3};
无效打印(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(){
印刷品(x);
}

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

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

  • 在(大多数)表达式中使用数组名时,或
  • 使用数组类型声明函数参数时
原因
int*x[]={a1,a2,a3}之所以有效是因为这3个数组“衰减”为指向其第一个元素的指针。在所有3种情况下,它的类型都是
int*
,因此它与
x
数组的元素类型兼容

然后,当您定义一个函数,例如
voidprint(int*a[])
,编译器会无声地隐式地将该数组声明“衰减”为指向第一个元素的指针。
int*[]
数组的第一个元素是
int*
,指向该元素的指针是
int**
。所以这个函数相当于
作废打印(int**a)。这就是为什么我们可以在这里写一个空的
[]
——编译器不关心数组大小,因为它无论如何都会用指针替换数组

这也是为什么多层间接寻址
a[0][2]
有效的原因。这并不是因为
a
是一个二维数组-它不是。但是第一个
[]
int**
类型执行指针运算,以获得相关的
int*
元素。第二个指针依次对指针元素进行指针运算,得到实际的
int

至于函数中的各行,这是一个人工学校的例子,旨在教授操作符优先级。提示:后缀运算符通常具有最高优先级


a[-1][1]
是一个bug,因为它调用了未定义的行为-我们不应该编写这样的程序,原因是它本身有点高级。此处的详细信息:

您是否阅读了C编译器的文档(例如…将作为
gcc-Wall-Wextra-g
调用)和调试器的文档(例如…)。另请参见和或一些较新的C标准。是否允许使用调试器?一步一步地运行你的程序?在纸上画图(用箭头表示指针,就像在wikipage中一样?),如果你读了这篇文章,你会怎么样?顺便说一下,你可以考虑安装在你的LabopDee上读关于S的wikpiges吗?那上面的那个呢?你可能想读一些。你能在纸上看书吗?你可以使用这个软件吗?或者?您可能想运行
gcc-fverbose asm-Wall-Wextra-O2-S-your prog.c
,并查看生成的汇编程序代码
your prog.S
,假设您被允许使用您知道如何工作吗?运算符
[]
对地址执行什么指针算法,你能详细说明一下吗?@pawanirpal像任何指针算法一样,每个索引或+1都会将偏移量增加
sizeof(type)
。所以,如果你在
int**
指针上做指针算术,你会得到
sizeof(int*)
。是的,谢谢你,这就是我所期望的,不过我不确定,现在是了,再次感谢你。