指向指针的指针
#include <stdio.h> int main () { int num=520; int *p=# int **pp=&p; printf("num:%d\n",num); printf("*p:%d\n",*p); printf("**p:%d\n",**pp); printf("&p:%p,pp:%p\n",&p,pp); printf("&num:%p,p:%p,*pp:%p",&num,p,*pp); return 0; }
结果
num:520
*p:520
**p:520
&p:000000000061FE08,pp:000000000061FE08
&num:000000000061FE14,p:000000000061FE14,*pp:000000000061FE14
pp是p的地址
指针数组和指向指针的指针
#include <stdio.h> int main () { char *cBooks[]={ "<c程序设计语言>", "<c专家编程>", "<c和指针>", "<c陷阱和缺陷>", "<c primer plus>", "<带你学c带你飞>"}; char **byFishC; char **jiayuLoves[4]; int i; byFishC=&cBooks[5]; jiayuLoves[0]=&cBooks[0]; jiayuLoves[1]=&cBooks[1]; jiayuLoves[2]=&cBooks[2]; jiayuLoves[3]=&cBooks[3]; printf("FishC出版的图书有:%s\n",*byFishC); printf("小甲鱼喜欢的图书有:\n"); for(i=0;i<4;i++) { printf("%s\n",*jiayuLoves[i]); } return 0; }
结果
FishC出版的图书有:<带你学c带你飞>
小甲鱼喜欢的图书有:
<c程序设计语言>
<c专家编程>
<c和指针>
<c陷阱和缺陷>
备注:
*byFishC是访问数组元素,数组中元素就是地址,不用**
数组指针和二维数组
#include <stdio.h> int main () { int array[10]={0,1,2,3,4,5,6,7,8,9,}; int *p=array; int i; for(i=0;i<10;i++) { printf("%d\n",*(p+i)); } return 0; }
结果
0
1
2
3
4
5
6
7
8
9
#include <stdio.h> int main () { int array[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; int **p=array; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%2d",*(*(p+i)+j)); } printf("\n"); } return 0; }
这是错误的写法
可以这样写
#include <stdio.h> int main () { int array[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; //int **p=array; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%2d",*(*(array+i)+j)); } printf("\n"); } return 0; }
p是array的首地址,p的跨度仍然是4,而不是一行,一行有多少个元素,p并不知道,可以证明一下
#include <stdio.h> int main () { int array[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; int **p=array; printf("p:%p,array:%p\n",p,array); printf("p+1:%p,array+1:%p\n",p+1,array+1); return 0; }
结果
p:000000000061FDE0,array:000000000061FDE0
p+1:000000000061FDE8,array+1:000000000061FDF0
可以看出p与p+1相差4个字节,array与array+1相差16个字节(刚好一行,4个元素),足以证明。
二维数组可以不写行数,但是要写列数。
用指针指向二维数组
#include <stdio.h> int main () { int array[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; int (*p)[4]=array; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%2d",*(*(p+i)+j)); } printf("\n"); } return 0; }
4是4列的意思,p指向的仍然是一维数组,考虑跨度问题,二维数组首地址给了p,p+1恰好是二维数组第二行的地址,因为p的跨度刚好4乘4,
之前的形式
#include <stdio.h> int main () { int array[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; int (*p)[3][4]=&array; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%2d",*(*(*p+i)+j)); } printf("\n"); } return 0; }
这样写有点麻烦
浙公网安备 33010602011771号