二维数组:int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

为什么这个四个的结果是一样的。谁能告诉我内存中,关于二维数组的指针机制在这里,是怎么运转的?
printf("%d\n",(&arr));
printf("%d\n",*arr);
printf("%d\n",&arr[0]);
printf("%d\n",&arr[0][0]);

二维数组的指针机制:就是按照一维分布的。
如:int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int* p = arr[0];就是说*p从1开始,*p[1]就是a[0][1],*p[2]就是a[0][2],等等,知道*p[11]就是a[3][2]
你说的那四个值一样,那是肯定的,都是计算机为这个二维数组分配内存的首地址,
1,是给二级指针再取地址,就变成三级地址。
2,3,都一样 是一级指针
4,表示去一般变量的地址。

不懂的可以再问。追问

每个人的回答,都好像拘泥于变量的定义啊,指针的定义啊..定义层面的我懂,我现在要的是应用层面的。
还有,你的这个int *p=arr[0];//合法
但是*p[1]就是非法了。如果想表达你书写的意思,貌似是用*(p+1)的形式,你可以试试。
还有就是附上个图,希望帮我把图中的每个输出的涵义讲解下,我觉得,差不多我就能懂了。

追答

那四个值一样,原因就是:都是计算机为这个二维数组分配内存的首地址,计算机用不同的类型表示了。
你说*p【1】错了,原因是p开始应该是:int*p = &arr[0][0];我之前写错了。

楼主:你的话“arr是内存地址毋庸置疑,&arr呢?新指针的地址和指向内存地址存放的值能相同吗?最要命的是。 arr &arr *arr 他们的值相等“。
你说的话证明你领悟指针的确很浅。内存地址实质就是个int型数据(排除溢出),一个int型数据不可以让多个可以存放它的变量存储吗?而arr &arr *arr 这三个就是最最让人头疼的指针级数,即 二级指针、三级指针、一级指针。他们都是用来存储地址的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-19

数组在内存中都是按照元素一个一个存储,比如int型占4个字节,那么arr就占有连续的48个字节的内存,你想问的应该是这些打印的区别,可以看注释,以下打印都是同一个地址值

void main()
{
int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; 
printf("%d\n",arr); //arr是数组名,同时也代表这个数组的地址
printf("%d\n",(&arr)); //代表arr[4][3]的首地址,&arr + 1的步长是12个int(一般为4字节)
printf("%d\n",*arr); //代表的是第一列数据的地址
printf("%d\n",&arr[0]);//代表是第一行数据的地址
printf("%d\n",&arr[0][0]);//代表数据第一个元素的地址

}

本回答被网友采纳
第2个回答  2012-03-26
首先你要知道:数组名代表数组中第一个元素的地址,所谓数组元素的指针就是数组元素的地址。上面是一个二维数组arr是其数组名,那么可以知道(&arr)就是取这个二维数组的地址,而数组的地址,就是其首元素的地址,也就是a[0][0]的地址,而数组的指针*arr也是数组的地址(一个变量的指针就是这个变量的地址,同样地,一个数组的指针也是一个数组的地址,而数组的地址就是它首元素的地址);&arr[0]意思是取第1行的地址,相当于整个数组的首地址。
所以以上四个的结果都是数组首元素的地址。追问

你的意思,是不是arr可以算作一个变量名的性质,其存放的值,是一个数组的首元素的地址?
按照你的这个思路来,*arr指向的应该是arr变量存放的那个地址的“变量”的“内容”?
**arr我刚刚编译时,试了下,刚好是数组元素arr[0][0]的值“1”。由此可见,arr存放的内容是一个指向指针的地址?
我的理解啊:系统在为一个变量分配内存时,一定会为这个变量分配一个内存地址。&arr arr *arr 分别代表的是3个值。可是这里,却相等

追答

*arr表示数组名就是一个指针变量,存放的是首元素的地址,就像你定义一个指针变量一样。
int *a;就是为了指明a是一个指针变量,存放的内容是地址,你再想想看。
*运算符的结合性是从右到左的,因此**arr可以写成*(*arr)这样就容易明白了吧,括号里的*arr说明arr是一个指针变量,存放的是首元素的地址,而**arr就可以理解为这个地址里的数据了。

追问

你也是。(*arr)如果代表的是个地址值,**arr肯定就是代表着(*arr)这个地址的存放“内容”。
附张图,
也许,你帮我把每一行的输出的涵义,都能解释下,我差不多就懂了

本回答被网友采纳
第3个回答  2012-03-26
1 2 3
4 5 6
7 8 9
10 11 12
数组名就是这个数组的首地址, &arr *arr取的都是首地址的内容 1
arr[0] 是数组的第一行的首地址 &arr[0] 取得就是第一行的首地址的内容 1
arr[0][0] 数组的第一个元素的地址 即 1 &arr[0][0] 取得就是第一个元素 1追问

&arr[0][0] 取得就是第一个元素 这个你好像错了。不信,我可以把图给你看。这四个的值全是一个arr[0][0]的地址值。

第4个回答  2012-03-26
首先我说一下中,这四个结果都有第一个元素的地址,最后一个我就不说了,那个是最容易去理解的了,而其它的几个你联想到指针就不难去理解了追问

你的答案,好像很有说服力,“都有第一个元素的地址”....是的。我的第四个语句,就是第一个元素的地址,我说过他们的四个结果输出相同,理所当然就是都“是”第一个元素的地址。您的答案又重复了一遍我的结论。

现在问题出来了,指针,我想这题想的快吐了,越想越矛盾。理解力,也混乱了。

赋张图,希望大牛,帮我分析分析,这张图5个语句的输出到底是什么涵义。

追答

首先我这样的跟你说吧,第一个和第二个是一个样的,这个也是好理解的,一个是&是地址符,*是指针标识符,也是指针间接运算符啊,我想问你一句,数组名就是代表这 个数组的首地址,这个你理解不,而且这是一个二维数组,我们是可以去看成是一个指针型的一维数组,这个你理解了那后面的第三个就不难去理解了

追问

我来给你纠正个逻辑上的错误。
一,&和*是俩个运算,有些人会理解为所谓的"可逆"。从字面上,一点不懂程序的人,都知道可逆是指俩个方面。从程序上讲,有了变量名,才会有内存地址。如果非要取内存地址的地址,则必须运用到一个新指针。这也就是指针的诞生和作用。
二,同一个内存地址,只能存放一个值?arr是内存地址毋庸置疑,&arr呢?新指针的地址和指向内存地址存放的值能相同吗?最要命的是。 arr &arr *arr 他们的值相等

追答

首先我要说的是,同一个地址下是可以存放不同的值,值是可以去覆盖的,这一点,你必须明白,我觉得你还是指针型数组你没有弄明白,你自己再去查一下资料吧,我也不多说了,说得再多,你的思路,没有纠正也是没有用的

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网