Arrays 在C中传递指针数组意味着什么?
我正在努力解决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]
#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*)
。是的,谢谢你,这就是我所期望的,不过我不确定,现在是了,再次感谢你。