c - 请解释d [2] [3]处的值

标签 c pointers

第二行中为(* 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/

相关文章:

c - 通过指针的二维数组

c++ - C语言中&(AND)运算符有什么用?

c - 带有 dup2()-ed 描述符的 FILE * 流 — stdin 不起作用

c++ - 如果这是未定义的行为,那么为什么将其作为看似合法的示例给出?

c - 使用预处理器避免读/写函数中的代码重复

c - 是否允许对 "compatible"结构体的结构体指针进行转换和取消引用?

c - 使用指针未声明的 Sprite 错误

C++:指针在传递后包含不同的地址

c - 为什么 b 数组不复制整个 a 数组?

c - 带 header 的 RPN,为什么不起作用?