一维数组和二维数组中的头指针

来源:互联网 发布:宝元数控车床编程手册 编辑:程序博客网 时间:2024/05/18 01:37

今天早上起来没事看看单片机的书,发现一个问题,这也是我以前学习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]出现的不是他的地址呢?  呵呵。。还没想明白

原创粉丝点击