二维数组:int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
为什么这个四个的结果是一样的。谁能告诉我内存中,关于二维数组的指针机制在这里,是怎么运转的?printf("%d\n",(&arr));printf("%d\n",*ar...
为什么这个四个的结果是一样的。谁能告诉我内存中,关于二维数组的指针机制在这里,是怎么运转的?
printf("%d\n",(&arr));
printf("%d\n",*arr);
printf("%d\n",&arr[0]);
printf("%d\n",&arr[0][0]); 展开
printf("%d\n",(&arr));
printf("%d\n",*arr);
printf("%d\n",&arr[0]);
printf("%d\n",&arr[0][0]); 展开
5个回答
展开全部
二维数组的指针机制:就是按照一维分布的。
如: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 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 这三个就是最最让人头疼的指针级数,即 二级指针、三级指针、一级指针。他们都是用来存储地址的。
展开全部
数组在内存中都是按照元素一个一个存储,比如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]);//代表数据第一个元素的地址
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你要知道:数组名代表数组中第一个元素的地址,所谓数组元素的指针就是数组元素的地址。上面是一个二维数组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就可以理解为这个地址里的数据了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
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]的地址值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先我说一下中,这四个结果都有第一个元素的地址,最后一个我就不说了,那个是最容易去理解的了,而其它的几个你联想到指针就不难去理解了
更多追问追答
追问
你的答案,好像很有说服力,“都有第一个元素的地址”....是的。我的第四个语句,就是第一个元素的地址,我说过他们的四个结果输出相同,理所当然就是都“是”第一个元素的地址。您的答案又重复了一遍我的结论。
现在问题出来了,指针,我想这题想的快吐了,越想越矛盾。理解力,也混乱了。
赋张图,希望大牛,帮我分析分析,这张图5个语句的输出到底是什么涵义。
追答
首先我这样的跟你说吧,第一个和第二个是一个样的,这个也是好理解的,一个是&是地址符,*是指针标识符,也是指针间接运算符啊,我想问你一句,数组名就是代表这 个数组的首地址,这个你理解不,而且这是一个二维数组,我们是可以去看成是一个指针型的一维数组,这个你理解了那后面的第三个就不难去理解了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询