指向指针的指针

#include <stdio.h>

int main ()
{
   int num=520;
   int *p=&num;
   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;
}

这样写有点麻烦

 

posted @ 2021-09-15 11:17  好想成为一只鸟  阅读(69)  评论(0)    收藏  举报