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

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

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

  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作为数组指针的形参都是相同的。

发布了15 篇原创文章 · 获赞 0 · 访问量 551
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览