为什么这个四个的结果是一样的。谁能告诉我内存中,关于二维数组的指针机制在这里,是怎么运转的?
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 这三个就是最最让人头疼的指针级数,即 二级指针、三级指针、一级指针。他们都是用来存储地址的。
数组在内存中都是按照元素一个一个存储,比如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指向的应该是arr变量存放的那个地址的“变量”的“内容”?
**arr我刚刚编译时,试了下,刚好是数组元素arr[0][0]的值“1”。由此可见,arr存放的内容是一个指向指针的地址?
我的理解啊:系统在为一个变量分配内存时,一定会为这个变量分配一个内存地址。&arr arr *arr 分别代表的是3个值。可是这里,却相等
*arr表示数组名就是一个指针变量,存放的是首元素的地址,就像你定义一个指针变量一样。
int *a;就是为了指明a是一个指针变量,存放的内容是地址,你再想想看。
*运算符的结合性是从右到左的,因此**arr可以写成*(*arr)这样就容易明白了吧,括号里的*arr说明arr是一个指针变量,存放的是首元素的地址,而**arr就可以理解为这个地址里的数据了。
你也是。(*arr)如果代表的是个地址值,**arr肯定就是代表着(*arr)这个地址的存放“内容”。
附张图,
也许,你帮我把每一行的输出的涵义,都能解释下,我差不多就懂了
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个语句的输出到底是什么涵义。
首先我这样的跟你说吧,第一个和第二个是一个样的,这个也是好理解的,一个是&是地址符,*是指针标识符,也是指针间接运算符啊,我想问你一句,数组名就是代表这 个数组的首地址,这个你理解不,而且这是一个二维数组,我们是可以去看成是一个指针型的一维数组,这个你理解了那后面的第三个就不难去理解了
追问我来给你纠正个逻辑上的错误。
一,&和*是俩个运算,有些人会理解为所谓的"可逆"。从字面上,一点不懂程序的人,都知道可逆是指俩个方面。从程序上讲,有了变量名,才会有内存地址。如果非要取内存地址的地址,则必须运用到一个新指针。这也就是指针的诞生和作用。
二,同一个内存地址,只能存放一个值?arr是内存地址毋庸置疑,&arr呢?新指针的地址和指向内存地址存放的值能相同吗?最要命的是。 arr &arr *arr 他们的值相等
首先我要说的是,同一个地址下是可以存放不同的值,值是可以去覆盖的,这一点,你必须明白,我觉得你还是指针型数组你没有弄明白,你自己再去查一下资料吧,我也不多说了,说得再多,你的思路,没有纠正也是没有用的