【发布时间】:2021-07-31 13:07:26
【问题描述】:
我正在为 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() 函数的激活记录应该包含一个数组,而不仅仅是一个保存 x 基地址的指针变量,而是整个混淆是指针还是指针数组,语法肯定暗示它应该是int 指针的数组,我在网上阅读但更加困惑,请不要通过标记无关来忽略这个问题。
【问题讨论】:
-
您是否阅读过Modern C、C 编译器的文档(例如GCC... 将作为
gcc -Wall -Wextra -g调用)和调试器的文档(例如GDB... )。另请参阅 this C reference 和 n1570 或一些更新的 C 标准 -
你可以使用调试器吗?并逐步运行您的程序?并在纸上画图(用箭头表示指针,就像在linked list wikipage 中一样?)如果您阅读documentation of GDB 会发生什么?顺便说一句,你可以考虑在你的笔记本电脑上安装Debian
-
你读过关于pointers 的维基页面吗?还有virtual address space 上的那个?您可能想阅读一些good operating system textbook。你能看纸上的书吗?你可以使用Clang static analyzer 吗?还是Frama-C?
-
你可能想运行
gcc -fverbose-asm -Wall -Wextra -O2 -S your-prog.c并查看生成的汇编代码your-prog.s,假设你被允许使用GCC -
你知道array pointer decay的工作原理吗?
标签: arrays c pointers parameter-passing