记住公式*(*(ptrArray+i)+j) == ptrArray[i][j]
- #include<stdio.h>
- int main(void){
- int zippo[4][2] = {{2,4},{6,8},{1,3},{5,7}};
- printf("zippo=%p,zippo+1=%p",zippo,zippo+1);//zippo指向的数据类型是包含两个int类型的数组,所以类型大小是8字节,所以地址实际
- //增长了8个字节
- printf("zippo[0]=%p,zippo[0]+1=%p",zippo[0],zippo[0]+1);//zippo[0]指向的数据类型是int类型,所以类型大小是4字节,所以地址实际
- //增长了4个字节
- return 0;
- }
声明指向多维数组的指针
声明的时候一定要告知编译器指向的数据的类型是什么!数组名表示法和指针表示法是可以通用的
记住
zippo[m][n] == *(*(zippo+m)+n)
p[m][n] == *(*(p+m)+n)
- #include<stdio.h>
- int main(void){
- int zippo[4][2] = {{2,4},{6,8},{1,3},{5,7}};
- int (*p)[2] = zippo;//必须要有括号,否则int *p [2]声明的是一个数组,该数组含有两个指针,这两个指针指向int类型
- printf("zippo=%p,zippo+1=%p",p,p+1);//p指向的数据类型是包含两个int类型的数组,所以类型大小是8字节,所以地址实际
- //增长了8个字节
- printf("zippo[0]=%p,zippo[0]+1=%p",p[0],p[0]+1);//p[0]指向的数据类型是int类型,所以类型大小是4字节,所以地址实际
- //增长了4个字节
- return 0;
- }
指针的兼容性
- #include<stdio.h>
- int main(void){
- int *p1;
- const int *p2;
- const int **pp2;
- p1 = p2;//编译错误,把const指针赋予非const指针
- p2 = p1;//可以把非const指针赋予const指针
- pp2 = &p1;//编译错误,不能进行多层运算,因为如果可以的话,就会有如下内容
- const int n = 13;
- *pp2 = &n;//两者都是const,但这样也会令p1指向n
- *p1 = 10;//合法,但是这样讲改变n的值
- }
函数和多维数组
- #include<stdio.h>
- #define ROWS 3
- #define COLS 4
- void sum_rows(int ar[][COLS],int rows);//列数信息必不可少,因为它表明指针指向的数据类型,但是行数可以没有,有也自动忽略掉
- void sum_cols(int [][COLS],int);//一般声明N维数组的指针时,最左边的方括号可以留空之外,其他都需要填写
- int sum2d(int (*ar)[COLS],int rows);
- int main(void){
- int junk[ROWS][COLS] = {
- {2,4,6,8},
- {3,5,7,9},
- {12,10,8,6}
- };
- sum_rows(junk,ROWS);//列是函数体内定义的,行数是靠函数传递得到的
- sum_cols(junk,ROWS);
- printf("Sum of all elements = %d\n",sum2d(junk,ROWS));
- return 0;
- }
- void sum_rows(int ar[][COLS],int rows){
- int r;
- int c;
- int tot;
- for(r=0;r<rows;r++){//首先固定row,求得的值是一行的和
- tot = 0;
- for(c=0;c<COLS;c++){
- tot += ar[r][c];
- }
- printf("row %d:sum = %d\n",r,tot);
- }
- }
- void sum_cols(int ar[][COLS],int rows){
- int r;
- int c;
- int tot;
- for(c=0;c<COLS;c++){
- tot = 0;
- for(r=0;r<rows;r++){
- tot += ar[r][c];
- }
- printf("col %d:sum = %d\n",c,tot);
- }
- }
- int sum2d(int ar[][COLS],int rows){
- int r;
- int c;
- int tot = 0;
- for(r=0;r<rows;r++){
- for(c=0;c<COLS;c++){
- tot += ar[r][c];
- }
- }
- return tot;
- }
转载于:https://blog.51cto.com/fanaticssk/827042