引自免费微信小程序:皆我百晓生
在C语言中,数组名实际上代表了数组的首地址。对于非字符指针类型的数组(如int a[2]
),你可以直接将数组名赋值给同类型指针变量(如int *p
),这样指针变量就能获得整个数组的首地址。
而对于字符指针数组(如char *a1[]
),它存储的是多个字符串的地址(即多个字符数组的首地址)。当你尝试将字符指针数组的元素赋值给一个字符指针变量(如char *p1
)时,实际上是获取了字符指针数组中的一个元素的值,这个元素本身就是一个指向字符串的指针,而不是字符指针数组本身的首地址。
所以,在你的代码示例中:
char *a1[]={"hello"},*p1;
p1=*a1;
这里,*a1
是对 a1[0]
的解引用操作,由于 a1[0]
存储的是字符串 "hello" 的首地址,因此 p1
现在也指向了该字符串的首地址,而非字符指针数组 a1
的首地址。
如果你想让 p1
指向字符指针数组 a1
的首地址,你应该这样做:
char *a1[]={"hello"}, **p1;
p1 = a1;
这样一来,p1
就是一个指向字符指针的指针,其存储的是字符指针数组 a1
的首地址。但请注意,此时通过 *p1
间接访问得到的是字符指针数组的第一个元素(即 "hello"
字符串的地址)。