复杂指针 (选学) 本章主要内容 ? 复杂指针(选学) – – – – 二维数组的地址 指针数组 指针的指针 数组指针 二维数组 二维数组中的地址 ? #include ? int main(){ ? int a[3][4],i,j; ? for(i=0;i<3;i++){ ? for(j=0;j<4;j++) ? printf("%d\t",&a[i][j]); ? printf("\n"); ? } ? printf("\n"); ? for(i=0;i<3;i++)printf("a[%d]=%d\ta[%d]+1=%d\n",i,a[i],i,a[i]+1 ); ? printf("\n"); ? printf("a=%d,a+1=%d\n",a,(a+1)); ? } 二维数组中的地址 二维数组中的地址 二维数组中的地址 ? 如有声明 int a[3][4]下面表达式的含义 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #include int main(){ int a[3][4],i,j; for(i=0;i<3;i++){ for(j=0;j<4;j++){ a[i][j]=i*10+j; printf("%d:%d\t",&a[i][j],a[i][j]); } printf("\n"); } printf("*a=%d\n",*a); printf("*(a+1)=%d\n",*(a+1)); printf("*a+1=%d\n",*a+1); printf("**a=%d\n",**a); printf("*(*(a+0)+0)=%d\n",*(*(a+0)+0)); printf("**a+1=%d\n",**a+1); printf("*(*a+1)=%d\n",*(*a+1)); printf("**(a+1)=%d\n",**(a+1)); printf("*(*(a+1)+1)=%d\n",*(*(a+1)+1)); printf("*(*(a+1)+5)=%d\n",*(*(a+1)+5)); printf("*a[2]=%d\n",*a[2]); printf("(*a)[2]=%d\n",(*a)[2]); printf("(*a+1)[2]=%d\n",(*a+1)[2]); printf("(*(a+1))[2]=%d\n",(*(a+1))[2]); 指针数组 ? 指针数组是连续的地址单元,如int *b[3];声明了3个指针,而b本身是和二级 指针同类型的地址量,举例: – #include – int main(){ – int a[3][4],i,j; – int * b[3]; – b[0]=a[0];b[1]=a[2]+1;b[2]=a[1]; – for(i=0;i<3;i++){ – for(j=0;j<4;j++){ – a[i][j]=i*10+j; – printf("%d:%2d,",&a[i][j],a[i][j]); – } – printf("\n"); – } – for(i=0;i<3;i++)printf("%d:%d\n",b[i],*b[i]); – } 二维字符数组与指针 ? char s[3][10]={ {'A','B','C'}, {'D','E','F'}, {'G','H'}}; ? char s[3][10]={ "ABC" ,"DEF","GH"}; ? char *p="ABCD"; ? char * b[3]={"ABC","DEF","GHIK"}; 指针的指针举例(一) ? 指针的指针是保存指针单元地址的单元 ? ? ? ? ? ? ? ? ? #include int main() { int a,*p,**pp; a=20; p=&a; pp=&p;//or *pp=p; **pp=50; printf("%d\n",a); } 指针的指针举例(二) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #include int main(){ int c[3][4],*pa[3],i,j; int **pp; pa[0]=c[0];pa[1]=c[2];pa[2]=c[1]; pp=pa; for(i=0;i<3;i++){ for(j=0;j<4;j++){ c[i][j]=i*10+j; printf("%d:%d\t",&c[i][j],c[i][j]); } printf("\n"); } for(i=0;i<3;i++)printf("%d\t",&pa[i]); printf("\n"); printf("%d\n",pp); printf("%d\n",*pp); printf("%d\n",*(pp+1)); printf("%d\n",*pp+1); printf("%d\n",**pp);/*输出a[0][0]*/ printf("%d\n",*(*pp+1));/*输出a[0][0]*/ printf("%d\n",**(pp+1));/*输出a[0][0]*/ printf("%d\n",*(*(pp+1)+1));/*输出a[0][0]*/ } 数组指针 ? ,int b[3][4]; b包含三个 元素b[0]、b[1]、b[2], 每个元素是一个一维数 组,b每加1,则指向下 一个数组,要保存这种 地址需要的变量就是数 组指针 ? 声明举例:int (*p)[4]; 指针归纳 复杂指针综合举例 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #include int main(){ int a[3][4],i,j; int *p[3];//指针数组,定义三个整型指针 int (*q)[4];//数组指针,定义一个指乡数组的指针 int **r;//定义一个指向整型指针的指针 for(i=0;i<3;i++){ for(j=0;j<4;j++){ a[i][j]=i*10+j; printf("%d:%2d,",&a[i][j],a[i][j]); } printf("\n"); } printf("%d\n",*(a[0]+5)); p[0]=a[0];//a[0],*p[0]都是整型指针 for(i=0;i<12;i++)printf("%d,",*p[0]++); printf("\n"); q=a;//a指向[3]数组的指针 for(i=0;i<3;i++)printf("%d,",**q++); printf("\n"); p[0]=a[0];p[1]=a[1];p[2]=a[2]; for(i=0;i<3;i++)printf("%d,",p[i]);//输出连续三个整型指针的地址 r=&p[0];//r指向指针数组首地址 ,,,r=&a[0]将产生错误 printf("\n"); 复杂指针综合举例