程序设计基础——指针进阶

一、指针数组

格式:
类型名 *数组名 [数组长度]   // 每一个元素都是指针

字符型   char *color[5];         // color[i] 可以指向一个字符变量,可以存储一个字符串的首地址

整型       int *a[10];       // a[i]可以指向一个整型变量 

 指针数组常使用字符型 (每一个指针都可以存储一个字符串 相当于二维数组

char *color[5]={"red","blue","yellow","green","black"};

使用样例: 

        ①输出首字母为 “ b ” 的单词 (类似二维数组

 if ( color [i][0]==' b ')          printf("%s",color[i]);

         ②交换字符串 (交换 color[0] 和 color[4] )

char *str=color[0];

color[0]=color[4];

color[4]=str;

二、二级指针(指向指针的指针)

格式:

类型名 **变量名        //指向 “ 类型名 ” 指针的指针  

int a=10; int *p=&a; // p 指向 a

int **pp=&p;  // pp 指向 p   

                                

 其中 :

        ① pp 等价于 &p

        ② *pp 等价于 p、&a

        ③ **pp 等价于 *p、a

关于一级指针,二级指针本质的理解:(注意交换的顺序)

        ①交换 a b

int a=10; int *pa=&a;int **ppa=&pa;

int b=20; int *pb=&b;int **ppb=&pb;

int t=a; a=b; b=t;                    

此时依次输出 a *pa **ppa  b *pb **ppb 为  20 20 20 10 10 10   

                                    

        ②交换 pa pb

int a=10; int *pa=&a;int **ppa=&pa;

int b=20; int *pb=&b;int **ppb=&pb;

int *pt=pa; pa=pb; pb=pt;           // 交换操作 pa=pb 指向 b  pb=pa 指向 a

此时依次输出 a *pa **ppa  b *pb **ppb 为 10 20 20 20 10 10

         ③ 交换 ppa ppb

int a=10; int *pa=&a;int **ppa=&pa;

int b=20; int *pb=&b;int **ppb=&pb;

int *ppt=ppa; ppa=pb; ppb=pt;         // ppa 指向pb  ppb 指向 pa

 此时依次输出 a *pa **ppa  b *pb **ppb 为 10 10 20 20 20 10

三、二级指针与二维数组

1.整型数组

        一维数组名是一个指针(常量),二维数组名是一个二级指针 (二者使用仍有区别)

① 一维数组:

    int a[10];   // 取一维数组地址 :int *p=a; (或者  int *p= &a[0];)

                         // 即 a 就是一个指针常量, a=&a[0];

           (a+i) 或 (p+i) 指数组元素 a[i] 的地址: *(a+0)=a[0];  *(p+0)=a[0];

                                                            *(a+i)=a[i];    *(p+i)=a[i];

② 二维数组

int a[10][10]; //取二维数组地址  int *pa=a[0]; 或者  int *pa=&a[0][0];

                                                                        int **ppa=&pa; 

                        //a 就是一个二级指针 a(数组名)=&a[0]; //地址为第一个元素a[0]的地址

                           a[0]是一个一级指针常量    a[0]=&a[0][0];   //地址为第一个元素a[0][0]的地址

                                所以  a = & a[0] = && a[0][0]; (值相等但不等价)

    a+1是 a 的第二个一维数组的地址 为 &a[1]

   例      a+i = &a[i]  *(a+i) = a [i]      **(a+i) = a[i][0]

             *(a+i)+j = &a[i][j]    *(*(a+i)+j) = a[i][j]

2.字符型数组

char *str[3]={"one","two","three"};  //  str(数组名) 等价  &str[0] 

str[0]是一个指针 即 str 是一个二级指针(一维字符串指针数组相当于二维字符串数组

*str == str [0]       **str =str [0][0]

*(str+i)==str [i]   *(*(str+i)+j) == str [i][j]

四、二级指针的应用

传递指针的地址:当需要在函数内修改指针本身的值(即指针的地址)时,就需要使用二级指针。

动态分配内存:使用二级指针可以在函数内动态分配内存,并且可以将分配的内存地址返回给调用函数。

使用指针数组:使用二级指针可以定义指向指针的指针数组。

使用指向指针的指针实现二维数组:使用二级指针可以定义一个指针,该指针指向一个包含整型值的指针数组。

其他:二级指针还有其他应用,例如可以用来实现可变参数函数、链表等。

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值