如何理解二级指针作为指针数组的形参

二级指针是指向指针的指针,因为指针存放的是地址,所以二级指针是指向一级指针本身的地址,而非一级指针所指向的某块内存的地址。

二级指针作为指针数组形参的示例代码如下:

  1 #include <stdio.h>
  2 
  3 //void display(char *ptr[100], int len)  // 第三种数组指针作为形参的写法 
  4 //void display(char *ptr[], int len)     // 第二种数组指针作为形参的写法
  5 void display(char **ptr, int len)        // 第一种数组指针作为形参的写法
  6 {
  7         for(int i = 0; i < len; i++)
  8         {
  9                 printf("%s\n", ptr[i]);           // 第一种输出方式
 10                 printf("%s\n", *(ptr + i));       // 第二种输出方式
 11                 printf("%s\n", *(&ptr[0] + i));   // 第三种输出方式
 12         }
 13 }
 14 
 15 int main(void)
 16 {
 17         char *arr[] = {"Hello", "koko", "Nice!"};
 18         int len = sizeof(arr) / sizeof(arr[0]);
 19         printf("arr[0] = %p\n", arr[0]);
 20         printf("&arr[0] = %p\n", &arr[0]);
 21         //printf("len of arr is %d\n", len);
 22         display(arr, len);
 23         return 0;
 24 }

结果:
Hello
koko
Nice!

注意:这里的指针数组存放了三个字符串"Hello"、"koko"、"Nice!",字符串名就是字符串首元素的地址,比如"Hello"就是字符'H'的首地址。
 

如上图所示:

① 由于指针数组arr[]存放的是char *型的指针,而字符串名就是字符串首元素的地址,所以数组的指针元素可以存放"Hello"、"koko"、"Nice!"这3个字符串。

二级指针是指向指针的指针,而指针存放的是内存的地址,即二级指针存放的是一级指针本身的地址,由于指针数组以数组名arr作为实参传递给函数display(char **ptr, int len)中的形参ptr,数组名是数组首元素的地址,而数组arr每个元素都是指针,也就是将首元素即指针本身的地址传递过去,因为二级指针指向的是一级指针本身的地址,所以**ptr=arr是成立的,也就是二级指针可以作为指针数组的形参,数组传递后的接收结果如上图里面的ptr=&arr[0]、ptr+1=&arr[1]、ptr+2=&arr[2],二级指针ptr指向了指针数组arr。

③ 在程序源码里面的第7、8、9行有三种二级指针的打印方式,%s输出的是字符串类型,作用是从字符串的首地址输出直到遇到空字符\0为止
   ptr[i]就是arr[i]即字符串名(字符串名是地址,可以用%s输出)
   *(ptr + i)=*(&arr[0]+i)=*(&arr[i])=arr[i]
   *(&ptr[0] + i)同上

④ 使用char *ptr[100]、char *ptr[]和char **ptr作为数组指针的形参都是相同的。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值