今天早上起来没事看看单片机的书,发现一个问题,这也是我以前学习C的时候没想明白的,但是当时也没仔细去想,一直以来都很混淆。今天总算是明白了。代码如下:
int main()
{
int a[3][4]; //定义一个二维数组
//int a[3]; //定义一个一维数组,这里屏蔽了
int *p,k=0;
int i,j;
p=a[0]; //如果用 p=a,会报错。
// p= a; //是适用于一维数组
// p= a[0]; // 要是在一维数组中使用也是错误的,应该修改成 prt = &a[0];此时 a[0]是int的数据了。
for(i=0; i<3; i++)
for(j=0; j<4; j++)
a[i][j]=k++;
printf("%d---------------%d/n",a[0],(a[0]+1) ); //在二维数组中 a[0]表示 数组的的首地址,而且是以最小元素为单位
printf("%d---------------%d",a,a+1); //而a 表示 数组的首地址,但是是以一维数组为单位。a+1表示a[1]
return 0;
}
虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。当用int *p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的
看来在一位数组和二维数组中 a,a[0]的意义还是不一样的啊。。
但是为什么在一维数组中打印a[0]出现的不是他的地址呢? 呵呵。。还没想明白