C语言中一个二维数组 它的数组名是a 那a和*a有什么区别? 一个二维数组,a和*a有什么区别,C语言

作者&投稿:逮净 (若有异议请与网页底部的电邮联系)
对于二维数组名a和*a,二者的区别在于类型不同。
对于
TYPE a[M][N];
当使用a时,可以等同于二级指针TYPE **型。
而使用*a时,等同于TYPE*型。
从概念上说,a表示二维数组a的首地址,而*a表示二维数组a第一行a[0]的首地址。这样在使用的时候就有所区别。比如 对a的操作a[4]表示a的第四行首地址,而对*a的操作(*a)[4]则代表第一行的第4个元素,即a[0][4]。

所以a和*a除了值相同外,其它的各方面都是不同的。

数据名可以看作指针常量,分配数组空间时指针值就确定下来了,不像声明的指针变量那样,值是不能改变的。*a=a[0],对于二维数组a[0]也是一个指针,他们都指向数组的首地址,值都相等,但是,a和a[0]虽然值相等,但对他们进行指针运算时,地址偏移的基础不同。

a是这个二维数据首地址,*a是第一个元素值。

其实不大 *a就是a[0]都是第一行的地址

有无指针指向的区别。

c语言 二维数组a【0】与a与a【0】【0】有什么区别?~

数组在内存中是连续按行分布的,对于a[2][3]={{1,2,3},{4,5,6}};它在内存中的分布式1,2,3,4,5,6;所以他等价于a[2][3]={1,2,3,4,5,6};在c/c++中,数组名也即是数组首地址,这里加入a=0x1000;那么它的地址分就是:1000,1004,1008,100c,1010,1014;&a[0][0]也就取第一个元素的地址,即1000,a[0]是第一行1000,1004,1008的首地址,也是1000,也即是a元素的首地址;

int *b=a[0];
*b和a[0]是等的,是a数组第一行首地址;不同的是a[0]是只读的,*b是可读写的因为b是指针变量,你可以试试a[0][3],a[0][4],a[0][5]都能打印出来,别看a[2][3]以为这样越界了,其实越不越界是按地址来算的,地址上讲,&a[0][3]=a[1],所以完全没问题;按照地址计算上面打印的值就是4,5,6;同理用*(b+3),*(b+4),*(b+5)也是一样的道理;
a就是数组的首地址,a[0]是第一行第一个元素的首地址,也即是a的首地址,&a[0]是第一行的首地址,从数值上将,没问题,只是数据类型上不一样;
a[0][0]就是取第一行第一个元素的值,也即是1

你可以把二维想象成XY坐标。
a在XY坐标的角度看待指针的指向的
而*a是在X坐标的角度看待指针的指向的
虽然他们都是指向原点