【整理】数组与指针
1.数组与函数参数
(1)一维数组 P180
1 int s[10]; 2 void sort(int a[],int n); 3 sort(s,10);
(2)二维数组或多维数组 P185
1 int fun(int a[3][10]); //正确 2 int fun(int a[][10]); //正确,第二维以及其他高维不能省略 3 int fun(int a[3][]); //错误
2.数组与指针
(1)一维数组 P204
1 int a[5]; //定义指向int型数据的指针 2 int *pi; 3 pi=a; 4 int (*pa)[5];//定义指向含有5个int型数据的数组的指针,数组指针 5 pa=&a;
ps:其中第2行和第3行,等价于int *pi=&a[0];等价于int *pi=a;
因为数组名代表数组的首地址,即第一个数据的地址,即a等价于&a[0],P201
举例:
a[3]=10; 等价于 *(pi+3)=10; 等价于 pi[3]=10; 等价于 (*pa)[3]=10;
(2)二维数组或多维数组 P204-205
1 int a[3][4],*pa; 2 int (*pb)[4],i; 3 //列指针,pa++从a[0][0]到a[0][1] 4 pa=&a[0][0]; //等价于pa=a[0];因为a[0][0]是a[0]数组的首地址 5 //行指针,pb++从a[0]数组指向a[1]数组 6 pb=&a[0]; //等价于pb=a;因为a[0]是a数组的首地址 7 for(i=0;i<12;i++) 8 *pa++=i; //遍历12个元素,优先级++大于*(取值) 9 for(i=0;i<3;i++) 10 (*pb++)[i]=(i+1)*(i+1); //仅访问a[0][0],a[1][1],a[2][2]
3.数组指针 P205
1 int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; 2 int (*p)[4]; 3 int i,j; 4 p=a; 5 for(i=0;i<3;i++) 6 { 7 for(j=0;j<4;j++) 8 printf("%2d",*(*(p+i)+j)); //遍历每个元素 9 }
小结:
a[i][j] 等价于 *(*(a+i)+j) 等价于 *(a[i]+j) 等价于 p[i][j]
——部分来自向艳编著《C语言程序设计》