为什么C语言中二维数组的数组名a和*a表示的是同一个值?

编译器处理时不是把二维当做是数组元素都是数组的一维数组处理么?那么a就是这个数组的首地址也就是a[0]的地址&a[0]。但是输出a与*a发现者两个值始终是相同的。

当定义二维数组a[M][N]时,数组名可以认为是二维指针,其指向二维数组的首地址。
于是a的值就是首地址的值。
而*a,就是a[0],a[0]是第一行的标记,代表第一行的首地址。
在二维数组中,所有元素都是紧密排列的,这样整个数组的首地址,第一行的首地址,和第一个元素的首地址,即a, a[0], &a[0][0] 都是相同的。
于是a和*a的值是相同的。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-05-24
当a是二维数组名时,a即&a[0],而*a即a[0]

两者的显式的值是相同的,但是基类型是不同的追问

那为什么值还会相同?难道a[0]的值和他的地址相同?

追答

说了,是显式的值相同,意义不同

如果定义int a[2][3];

a类型是 int (*)[3]
*a类型是 int *

这二者,显式的只都是相同的,但是意义不同

本回答被提问者和网友采纳
第2个回答  2012-04-19
*a表示数组的第一个元素的值,而二维数组的第一个元素是一个一维数组。这个一维数组的首地址是a[0],所以a = *a = a[0] = &a[0][0]
第3个回答  2012-04-19
两个的地址相同追问

为什么地址会相同?

追答

数组a刚被调用时,调用的是数组的第一个数据,*a是可以直接代替数组a的,调用*a和调用数组a没多大的区别

第4个回答  2018-03-22
首先 a[0] 和 *(a+0)等价,且 a[i]只是一个地址(如同一维数组名 只是一个指针常量)
这些你得知道。
在a[][m]中,  
a为二维数组名,值为0行首地址;
a[0] 和 *a 为      0行0列的地址。

*(a[i]+j)和*(*(a+i)+j) 才是 a[i][j]的值。

为什么C语言中二维数组的数组名a和*a表示的是同一个值?
于是a的值就是首地址的值。而*a,就是a[0],a[0]是第一行的标记,代表第一行的首地址。在二维数组中,所有元素都是紧密排列的,这样整个数组的首地址,第一行的首地址,和第一个元素的首地址,即a, a[0], &a[0][0] 都是相同的。于是a和*a的值是相同的。

为什么C语言二维数组a[2][2], a和*a输出是相同的,都表示一个地址
二维数组可以理解为几个指向一维数组的指针组成指针数组。所以从类型上讲,a是指向指针的指针,*a是指向一行一维数组的指针。但a作为数组名,又表示了数组首地址(在内存中元素地址是连续的)。a是第一行数组首地址。所以值相同 (注意只是值相同,比如a[n]和(*a)[n]意义就不一样,一个表示第n行...

C语言中一个二维数组 它的数组名是a 那a和*a有什么区别?
从概念上说,a表示二维数组a的首地址,而*a表示二维数组a第一行a[0]的首地址。这样在使用的时候就有所区别。比如 对a的操作a[4]表示a的第四行首地址,而对*a的操作(*a)[4]则代表第一行的第4个元素,即a[0][4]。所以a和*a除了值相同外,其它的各方面都是不同的。

2维数组*a与a与&a为什么相同啊!
那么&a就是第一个数组的手地址,a是整个二维数组的手地址,刚才不是说了,而维数组的手地址也就是第一个一维数组的手地址,*a是一个指针,当然先要指向数组的首地址阿,在c语言中有这样一句话:指针就是地址“可以看到他们三个表示的是同一个东西 希望对你有帮助了 ...

c语言 为什么*a和a指向同一个地址?*a不是取地址里面的内容吗,就是取值...
c语言里二维数组是一维数组所组成的数组 short a[3][4]; 有3个元素,每个元素都是由4个short组成的数组,注意,每个元素都是数组 a就是a[0], 有上面说的可知,a[0]是个数组,那自然就是个地址了 可以再加一句:printf("%d\\n",**a); \/\/ 这个就是a[0][0]了 ...

c语言中二维数组a[i][j],为什么a=*a?
这组数据在内存中是连续存放的。而在C语言的使用中,a是二维数组的首地址。*a也就是a[0],是二维数组第一行的首地址。所以,二者是相同的地址值,即数据a[0][0]的地址值。也就是说,从值上,a,*a, a[0],&a[0][0]都是相同的值。当时,说a=*a也并不是完全正确的,从类型上,a等同...

C语言、二维数组指针中的 * 和 &
1、我看了你说的这两页,书上的原话是这样的:“在二维数组中,a+i,*(a+i),&a[i],&a[i][0]的值相等,即他们都是同一地址值”,要注意这个字眼“地址值”,也就是说,这几种表达方式并不是内存中存的数值,而是存放数组的地址的值,首先要弄明白,首地址这个概念,如果只写数组名,就...

关于二维数组中的一个问题...高手进!
a+1是&a[1],是a[1]的地址,而*(a+1)是a[1],是a[1][0]的地址,因为二者都在数组a[][]的首位置,数值必然是相等的,但是很明显,a[1]和a[1][0]类型是不一样的.换个角度:int i = 0;int *p = 0;那么,能说p等价于i么?不能,虽然数值相同,但是二者的含义却是完全两样的....

c语言数组中*a为什么和a【0】相等
因为数组的首地址也就是数组名,你的数组名为a,则 * 意思是取内容,*a就是 a地址的内容 a地址又因为是首地址和a[0]一样,所以可以说*a=a[0]望楼主采纳

c语言中,数组名的前面加*, 如a[3][4]; *a输出的是什么结果
由于a[3][4]是个二维数组,数组名是数组的首地址,也是一维a[3]的首地址,也是一维第一个元素a[0][0]的首地址,因此a a[0] a[0][0]三个的地址是相同的,那么*a在这里代表什么呢,*在这里代表的是取值符,而不是指针符号,由于a是个二维数组,*a代表的是取第一维的首元素,而这里...

相似回答