其实这两个东西比较难理解,应该没有那么重要。让我们了解一下。主要是理解数组指针的操作。最近学习c语言提上日程了~~~先记下所有打算看的书,、系列、先说说a和&a的区别(三点,三个方向):就是a和&a的本质,是什么类型。从二维数组的角度来看。从指针运算的角度来看。声明:数组名虽然不是指针,但很像指针。我们暂时称它为指针。第一个问题:什么是inta[10];a,&a和&a[0]?先说明一下a、&a和&a[0]三个值是相等的。a称为数组名,是数组第一个元素的地址,也就是&a[0]的值。和指针类型一样,是int指针类型,int*,我们先理解为指针。&a这是一个真正的指针,一个数组指针。是数组的地址。记住:&a不是指向指针的指针,因为&a和a的值是相等的,但是*&a和*a的值不相等。*&a与a的值相同,也就是说*&a只取数组指针的值,获取的是数组的值,即数组首元素的地址,而不是取数组的地址&A。这应该是c语言对数组指针操作的规定。这里的数组指针&a的值之后,就变成了a,也就是a,不是*a,就变成了这个数组的数组名,或者说是数组首元素的地址。我做了以下实验:#includeintmain{inta[5]={1,2,3,4,5};printf("a=%x\n",a);printf("&a=%x\n",&a);printf("*(int*)&a=%x\n",(*((int*)(&a))));printf("*&a=%x\n",(*(*(&a))));printf("&a[0]=%x\n",&a[0]);printf("*&a[0]=%x\n",*(&a[0]));return0;}printf("*(int*)&a=%x\n",(*((int*)(&a))));这句话并没有像往常一样进行&aValue,而是强制进行类型转换,可见这不是指向指针的指针。第二个问题:在二维数组中遍历指针的方法不是指向指针的指针(二级指针)。这句话printf("%d\n",*(*(a+i)+j));*(a+i)是通过取数组指针的值来获取数组首元素的地址。常见的误解是获取数组指针值的操作与普通指针值的操作不同。数组指针的取值操作类似于一个强制类型转换的过程。注:二维数组的数组名a为第一个一维数组的数组指针,*a为第一个一维数组的数组名。也可以直接使用tpye*强制类型转换。#includeintmain(intargc,char*argv,char*e??nv){inta[3][3]={{0,1,2},{3,4,5},{6,7,8}};inti=0;intj=0;for(i=0;i<3;i++){for(j=0;j<3;j++){//printf("%d\n",*((int*)(a+i)+j));printf("%d\n",*(*(a+i)+j));}}