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