() 和 [] 的优先级一样,但是结合性是从左往右,所以*和p先结合,说明这是一个指针 这个指针指向一个整型的数组,并且这个数组每行的长度为n,也就是p的步长。 所谓数组指针都是因为指针的步长问题 1. 数组指针(行指针) // 数组指针:指向数组的指针(在C语言里就是用来指向一个二维数组的) 定义形式:int (*p)[n]; ///////////////////////////////////////////// 二维数组和数组指针: int a[2][3] = {{10, 20, 30}, {40, 50, 60}}; //char b[5]={'a','b','c','d','e'} int (*p)[3] = a; //char (*pb)[5]=&b; int row=sizeof(a)/sizeof(a[0]);//数组行数 int col=sizeof(a[0])/sizeof(a[0][0]);//数组列数 第0行第1列元素的地址 p[0]+1 *p+1 &p[0][1] 第1行第2列元素的地址 p[1]+2 *(p+1)+2 &p[1][2] 第i行第j列元素的地址 p[i]+j *(p+i)+j &p[i][j] 第0行第1列元素的值 *(p[0]+1) *(*p+1) p[0][1] 第1行第2列元素的值 *(p[1]+2) *(*(p+1)+2) p[1][2] 第i行第j列元素的值 *(p[i]+j) *(*(p+i)+j) p[i][j] 二维数组和数组名: int a[2][3] = {{10, 20, 30}, {40, 50, 60}}; 第0行第1列元素的地址 a[0]+1 *a+1 &a[0][1] 第1行第2列元素的地址 a[1]+2 *(a+1)+2 &a[1][2] 第i行第j列元素的地址 a[i]+j *(a+i)+j &a[i][j] 第0行第1列元素的值 *(a[0]+1) *(*a+1) a[0][1] 第1行第2列元素的值 *(a[1]+2) *(*(a+1)+2) a[1][2] 第i行第j列元素的值 *(a[i]+j) *(*(a+i)+j) a[i][j] 结论:a是一个指向int array[5]的数组指针(在二维数组里也叫行指针),&a代表整个数组的地址 a+1偏移3个int的长度(也就是3*4个字节),&a+1偏移2*3个int的长度(也就是2*3*4字节) (a+i)代表着整个第i行的地址 *(a+i)代表着第i行首元素的地址 数组名是一个常量指针永远指向数组首元素的地址 2. 指针数组://指针数组:装有指针的数组 定义形式: int *p[n]; char *p[]={"abc","efg","ijk"};//指针数组:装有指针的数组 int num=sizeof(p)/sizeof(p[0])//字符串的个数,注意[]里是否写了数字 //////////////////////////////////////////////////// 一维数组和指针: int a[5] = { 10, 20, 30, 40, 50}; int *p = a; 第0个元素的地址 p &p[0] 第1个元素的地址 p+1 &p[1] 第i个元素的地址 p+i &p[i] 第0个元素的值 *p p[0] 第1个元素的值 *(p+1) p[1] 第i个元素的值 *(p+i) p[i] 一维数组和数组名: int a[5] = { 10, 20, 30, 40, 50}; int count=sizeof(a)/sizeof(a[0])//数组的个数,注意[]里是否写了数字 第0个元素的地址 a &a[0] 第1个元素的地址 a+1 &a[1] 第i个元素的地址 a+i &a[i] 第0个元素的值 *a a[0] 第1个元素的值 *(a+1) a[1] 第i个元素的值 *(a+i) a[i] 结论:a代表数组首元素的地址,&a代表整个数组的地址 a+1偏移一个int的长度(也就是4个字节),&a+1偏移4个int的长度(也就是5*4字节) 数组名是一个常量指针永远指向数组首元素的地址 ////////////////// 注意:当用 sizeof(a)/sizeof(a[0]) 时要看数组中的[]是否写了数字