第二行中为(* d)[4]
分配了什么?
资源:
#include<stdio.h>
int main()
{
int c[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19},
(*d)[4] = (int (*)[4])(c+5);
printf ("d[2][3]: %d\n", d[2][3]);
return 0;
}
输出:
d [2] [3]:16
最佳答案
int (*d)[4]
是一个指向整数的指针数组。
假设整数在您的系统中占据4个字节,并且内存分配从零开始,即
&c[0]
为zero
(*d)[4] = (int (*)[4])(c+5)
将导致(* d)[0]具有该值
c+5*sizeof(int)
那是
0+5*4 = 20.
由于您要进行强制转换,即
(int*)
,因此20
被视为内存地址,其值为整数,在您的情况下为5
详细说明 :
d[0] will have the value 20
和
(*d)[0] will have the value 5 ie dereferencing the contents of address 20
当您执行int a [20]时,内存被分配为连续块
即
add - value
0 - 0
4 - 1
8 - 2
.
.
.
24 - 6
.
.
and so on
通过
(*d)[4]
我想您正在尝试将此内存分为4 * 4块。前4个(从0到3计数)代表行(由您将其计算为4),第二个4(从0到3计数)代表您已明确为其指定值的列。
由于指针支持类似操作的数组,
(* d)确实是*(d + 0),而实际上是d [0]。你可以拥有
d[0][0],d[0][1],d[0][3],d[0][3]
.
.
.
d[3][0],d[3][1],d[3][2]
在您的情况下,将值分配到
d[3][2]
(即19),并且没有为d [3] [3]分配值。如果尝试访问它,则可能会得到不明确的值,甚至会导致程序崩溃。
关于c - 请解释d [2] [3]处的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36820713/