你需要了解这几个知识点:
1:char * p;表示的初始化, p指向的是一个char变量的地址。
2:char a[]; char数组,如果单纯的写数组名a,其实就是数组的首地址。 比如char a[] = "abc"; printf("%s \n",a); a其实指向的是数组的首地址
3:结合起来理解 char *a[],其实就是二维数组,而a其实是二维数组的首地址,*p是第一个字符串的位置
4:函数传参时 定义成char *p;传入参数一维数组char a[];的数组名a;,隐含的含义就是数组的首地址的位置 char **你可以理解为取一维数组a的地址的地址,而char a[]; a隐含的是一个地址,char * a[];换个角度就是存储了一个一维数组地址的char *类型,
有点绕,可能我也说不清,char *p;p执向的是一个地址,char ** p;p执行的是一个地址的地址; char a[] = "abc";数组a隐含a指向数组的首地址,然后char *a[];指向数组首地址的地址,然后按地址+1,其实就是,移动的其实就是一个数组位。(可以用指针的方式打印这个二维数组内的字符串理解一下)
下面是我的理解,供你参考:
#include <stdio.h>
void fun(char **p){
++p;
printf("%s\n",*p);
}
int main(void){
//char * a[]是一个字符指针(指向字符串)的数组
//而数组也可以用指针来表示,所以用字符指针的指针类型来代表数组a,然后传入函数fun进行打印
char *a[] = {"Morning","Afternoon","Evening","Night"};
fun(a);
return 0;
}
数组a
的类型时char *[4]
,当数组名作为参数传给函数时,其类型会自动转换为指针类型,即char *[4]
类型转换为char **
https://en.cppreference.com/w/c/language/array#Array_to_pointer_conversion