二级指针是指向指针的指针,因为指针存放的是地址,所以二级指针是指向一级指针本身的地址,而非一级指针所指向的某块内存的地址。
二级指针作为指针数组形参的示例代码如下:
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作为数组指针的形参都是相同的。