返回首页

下面的代码给出了输出: -

地址:3213360604价值:3213360604
地址:3213360604值:0


int main()

{

    unsigned int a[3][3] = {};

 

    printf("Address : \t%u \tValue : \t%u\n", &a[0], a[0]);

    printf("Address : \t%u \tValue : \t%u\n", &a[0][0], a[0][0]);

 

    return 0;

}


不同的价值观如何才能被储存在同一个地址吗?

回答

评论会员:Stefan_Lang 时间:2012/02/06
这里是你的数组的内存布局:
{C}以你的数组的元素0分,1 [0],以及[0] [0],让您得到相同的值这两种表达方式。

什么是混淆你的是,虽然A [0],A [1]和[2]语法作为控股(常数)变量的指针治疗,有没有实际持有这些指针变量的值的内存。相反,他们持有的价值是来自在变量中存储的地址
评论会员:游客 时间:2012/02/06
CPallini:由于dereferecing数组名([0],就像是一个数组名),给出了相同的结果则数组名称本身,即数组的基地址。这是众所周知(怪异?)功能的C和C:查克・奥图尔
您的期望,[0]和[0,0]同样的法律,以检索的第一个值数组的元素是不正确的。

因为您正在使用一个多维数组,当你使用一个单一的维度语法引用它,你不会在适当的数组项,你正在开始的第二维数组的地址。两个实验会澄清这一点。

第一,而不是打印出来的价值,尝试使用它,看您收到的错误消息。
unsigned int foo = a[0];

 

error C2440: 'initializing' : cannot convert from 'unsigned int [3]' to 'unsigned int'

其次,改变计划,打印出的其他指数,这将告诉你一个[0],A [1],[2]通过指针踏着的阵列,而不是数组本身的数据。

{体C3}