让我们说:int A [5] [2] [3]; 现在,如果我这样做:A [1] [0] [0] = 4; 这是否意味着:
1.)A [1]和A [1] [0]是指针?
2.)如果A [1]是指针,那么它将存储指针A [1] [0]的地址?
3.)如果A [1] [0]是指针,那么它将存储A [1] [0] [0]的地址,它不是指针而只是存储4的值的变量?
如果以上几点是正确的,那么为什么dos下面的代码给我们相同的整数地址:
int main(void)
{
int A [5] [2] [3];
A[1][0][0]=4;
printf("%d\n\n", A[1]);
printf("%d\n\n", A[1][0]);
printf("%d\n\n",&A[1][0][0]);
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
这里,我假设A [1]是指向另一个指针A [1] [0]的指针,因此存储指针A [1] [0]的地址.并且,A [1] [0]是指向VARIABLE A [1] [0] [0]的指针,因此存储VARIABLE A [1] [0] [0]的地址.
请帮我!
要正确回答您的问题,请阅读行主顺序,这就是多维数组在 C 中的存储方式。维基百科文章有点过于简洁,但其中一篇可能更清楚:
http://webster.cs.ucr.edu/AoA/Windows/HTML/Arraysa2.html http://archive.gamedev.net/archive/reference/articles/article1697.html http://www.ibiblio.org/ pub/语言/fortran/append-c.html
还有这个问题。
直接回答你的观点,假设你知道行优先存储是如何工作的:
int A[5][2][3]声明一个长度为 5*2*3 个整数的连续内存区域:五个数组,每个数组包含两个数组,每个数组包含三个整数。数组在线性存储器中彼此相邻存储,因此
&A[0][0][0] == A
&A[0][0][1] == A+1
&A[0][1][0] == A+(1*3)
&A[3][1][2] == A+(3*(2*3))+(1*3)+2
Run Code Online (Sandbox Code Playgroud)
A[1]从技术上讲,它不是一个指针,而是一个数组。这是一个int [2][3]数组。但我发现,考虑A[5][2][3]一个平坦的内存区域(三十个整数长)比考虑更不清晰。
A[0][0][0] is the first integer in that region.
A[0][0][1] is the second integer.
A[0][0][2] is the third integer.
A[0][1][0] is the fourth integer in this flat region.
A[0][1][1] is the fifth integer.
And so on until A[1][0][0] is the eleventh integer.
Run Code Online (Sandbox Code Playgroud)
因此 的地址A[1][0][0]是过去十个整数A[0][0][0];IE,&A[1][0][0] - &A[0][0][0] == 10。因为 C 语言对数组和指针之间的区别非常宽松,A[1]所以当您在表达式中使用它时,它会被解释为地址,即使它实际上意味着“由两个数组组成的五个数组的数组中的第一个元素三个整数”,这又是“两个三个整数数组的数组”。
结果是它A[1]不存储指针,它只是一个指针。&A[0][0][0]从到的每个内存地址都&A[5][2][3]-1在多维数组中存储一个整数。
您在第 (2) 点和第 (3) 点中想到的是指向 arrays 的指针数组,这是不同的。
用图片解释起来要容易得多,这就是为什么你应该找到一本关于 C 数组的合适的教科书或文章。
一般来说,在学习 C 语言中的指针和数组时,我建议您暂时忘记该语言本身,并假装您是 Dennis Ritchie 在具有 56kb 平面 RAM 的 PDP-11 计算机上发明 C。拿一张大方格纸,连续编号其单元格,假设它代表您的 RAM,每个单元格都是一个字节,然后您可以用铅笔和纸完成指针数学运算。
C 是在那个环境中发明的,了解它的起源将使现代语言变得更加明智。
附带说明一下,当我尝试编写这个答案时,Stack Overflow 的标记语言反复更改并搞乱了上面数组示例中的索引。因此,如果您看到任何数字似乎超出了其数组的范围,则这是编辑器引入的错误。