为什么c语言中a[0],*(a+0),&a[0]是相等的?

为什么c语言中a[0],*(a+0),&a[0]是相等的?前两个不应该至少有一个表示数组里第一个元素的值吗?
如果都是用来表示地址的话,怎么才能表示数组里第一个元素的值呢?
额我有点没说清楚,是在二维数组的情况下。

数组的首地址也是指针,int a[10],int *p.这里的a和p都是指针。只不过,数组的首地址不能改变,而p可以指向其他地址。
a[0]表示数组a的第一个元素
*(a+0)也表示数组的第一个元素
&a[0]表示数组的第一个元素的地址,也就是首地址。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-08-26
谁告诉你这3个是相等的?

**a在C语言中表示a[0]a[0],为什么?
举例说明,如果定义了一个二维数组a[10][10],则a本身代表着这个数组的首地址,其本质就是定义了一个二维指针,a[m][n]与*(*(a+m)+n))表示相同意思,都表示取第m行第n个变量,m和n都取0时,就是问题所示。建议阅读下csdn上有关指针和数组的博客,有很多解释,这上面的说明还很口语化。

在c指针的通过指针引用多维数组中,为什么a[0]和*(a+0)等价
a[0]是第0行的首地址,也是第0行第0列的地址 a[1]是第1行的首地址,也就是第1行第0列的地址 a[2]是第2行的首地址,也就是第2行第0列的地址 (a+0)这里的*号不是取内容符号,根据一维数组和指针的关系,*a(+0)指针a[0]的另一种表示方式,

在c指针的通过指针引用多维数组中,为什么a[0]和*(a+0)等价
a[0] 是第0行的首地址,也是第0行第0列的地址 a[1] 是第1行的首地址,也就是第1行第0列的地址 a[2] 是第2行的首地址,也就是第2行第0列的地址 (a+0) 这里的*号不是取内容符号,根据一维数组和指针的关系,*a(+0)指针a[0]的另一种表示方式,

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

C语言、二维数组指针中的 * 和 &
i][j],其中的i代表的是数组的行,j代表的是数组的列,a+i,其实是加了i行,也就是第i行的第一个元素的地址,可以理解成a[i](把a[i]这一行想象成以为数组,根据一维数组的思路思考,就能明白了),即a+i和a[i]的值相等,如书上所说,在根据上面解释一维数组的思路考虑,&a[i][0]...

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

实在想不明白a和&a为什么是相等的。&a是a的地址啊,&a=a,岂不是相当于...
而对于数组 a[5] a本身就是这个数组的首地址了 &a同样是这个数组的首地址 所以值是一样的 其实 可以这样理解, a[0]是值, a和&a[0]一样是地址,那么 系统不可能再开一个新的内存 来存a的地址 这样的话就无穷无尽了 所以 这个可以认为是一种约定,对于数组 &a和a一样值 都是首地址,...

C语言中*p=a[0]与*p=&a[0]有什么区别?
p=a[0],令p所指向地址的内容等于a[0],p是一个一级指针;p=&a[0],令p所指向地址的内容等于a[0]的地址,p是一个二级指针。

a是数组,&a和a是同一回事?
题面中a和&a尽管它们的值一样,但意义不同:a就是&a[0],a+1自然就是&a[1],而&a+1就跳过这个数组指向'\\0'后面的位置了,因为对于&a来说,1表示a这个数组而不是一个元素!以上是说a与&a的不同,还没有涉及到输出一样的问题。至于printf("%s\\n",a);和printf("%s\\n",&a);输出...

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

相似回答