int *a:一个int类型数据的指针
int *a;
int arr1[3]={4,9,18};//一维数组,arr1是数组名,存放arr1数组首元素地址
a=arr1;//a存放arr1数组首元素地址,指针或数组名+1,增加一个存储单元(int4个字节),指向arr1第二个元素的地址
a=&arr1[0];//a存放arr1数组首元素地址
int k=*a;//k存放arr1数组首元素-->k=4;
*和++优先级相同,遵守自右向左,所以a++,然后才是*a。
int total=*a++;是先指向a的地址(第一个元素地址),取值,再递增指针(a指向第二个元素地址)–>total=4,
int total=*++a;是先递增指针(a指向第二个元素地址),再取值–>total=9
int total=(*a)++;是先取值,再递增该值–>total=5
int *b[3]:指针数组,指向指针的数组,本质上是一个数组
int *b[3];//数组里包含了3个指向int类型数据的指针
int arr2[3]={5,10,45};//一维数组,arr2是数组名,存放arr2数组首元素地址
b[0]=arr2;//b[0]存放数组arr2首元素的地址
b[1]=&arr2[0];//b[1]存放数组arr2首元素的地址
b[2]=&arr2[2];//b[1]存放数组arr2第三个元素的地址
int x=*b[0];//x存放数组arr2首元素-->x=5
int y=*b[1];//y存放数组arr2首元素-->y=5
int z=*b[2];//y存放数组arr2第三个元素-->z=45
int o=b[2]-b[1];//(指向同一个数组arr2) 指针-指针=指针所指向两个元素(45和5)的距离-->o=2(2个int)
int (*c)[3]:数组指针,指向数组的指针,本质上是一个指针
int (*c)[3];//指针变量名是c,指向一个包含3个int类型数据的数组
int arr3[3]={4,5,6};//一维数组,arr3是数组名,存放arr3数组首元素地址
c=&arr3;//&arr3是指整个数组的地址(值与首元素地址相同,但意义不同)
//执行c+1,就要跨过3个int类型数据的长度
//执行&arr3+1,就要跨过3个int类型数据的长度
//c=arr3错误,"="左边c是指向整个数组的指针,而右边arr3是指单个数组首元素地址,类型不一致
int i=**c;//c是整个数组arr3的地址,c=&arr3
//*c是数组arr3首元素地址,*c=arr3=&arr3[0]
//**c才是数组arr3首元素,**c=arr3[0]
int j=*(*c+1);//(*c+1)数组arr3第二个元素地址,*(*c+1)才是数组arr3第二个元素
int array[3][4]:二维数组与数组指针
二维数组首元素 array[0] 是一个包含了4个int类型数据的一维数组
&array[0]指这整个一维数组的地址, 一维数组名array[0]指该一维数组首元素地址,即&array[0][0]
int array[3][4];
//二维数组名array是二维数组首元素的地址,即&array[0],是整个array[0]数组(包含了4个int类型数据)的地址
//array+1,就要跨过4个int类型数据的长度,到二维数组第二个元素的地址,即&array[1]
//一维数组名array[0]是该一维数组首元素地址,即&array[0][0],是单个int类型数据的地址
//array[0]+1,就要跨过1个int类型数据的长度,到一维数组第二个元素的地址,即&array[0][1]
//等价关系如下:
//array[0]=&array[0][0]
//*array[0]=array[0][0]
//array=&array[0]
//*array=&array[0][0] //*array,等价于array[0]的值,但array[0]的值等价于array[0][0]地址
//**array=array[0][0] //array是地址的地址,必须两次才能获得原始值
int i=*(*(array+2)+1);//i=?
//==*(*(&array[2])+1)
//==*(array[2]+1)
//==*(&array[2][0]+1)
//==*(&array[2][1])
//==array[2][1]
int (*d)[4];
//d是一个指针变量名,指向一个包含4个int类型数据的数组
//数组指针的长度4要与二维数组分解成多个一维数组,一维数组的长度(即二维数组的列数4)一样
d=array;//"="左边d是指向整个数组的指针,右边arrry是整个array[0]数组的地址,类型一致
//d虽然是一个指针,不是数组名,但是也可以使用d[0],d[0][0]这种写法
printf("%p\n",array);
printf("%p\n",array[0]);
printf("%p\n",d);
printf("%p\n",d[0]);
//可以用数组表示法和指针表示法表示一个数组元素
int i=*(*(array+m)+n);//i=array[m][n]
int j=*(*(d+m)+n);//j=array[m][n]