1 例子之指向3个字符串的指针数组,易混淆!
1.1过程详解:
char *str[3]={
"Hello,thisisasample!",
"Hi,goodmorning.",
"Helloworld"
};
char s[80];
strcpy(s,str[0]); //也可写成strcpy(s,*str);
strcpy(s,str[1]); //也可写成strcpy(s,*(str+1));
strcpy(s,str[2]); //也可写成strcpy(s,*(str+2));
上例中,str 是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str 当作一个指针的话,它指向数组的第0 号单元,它的类型是char **,它指向的类型是char *。
*str 也是一个指针,它的类型是char *,它所指向的类型是char,它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即'H'的地址。注意:字符串相当于是一个数组,在内存中以数组的形式储存,只不过字符串是一个数组常量,内容不可改变,且只能是右值.如果看成指针的话,他即是常量指针,也是指针常量.
str+1 也是一个指针,它指向数组的第1 号单元,它的类型是char**,它指向的类型是char*。
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,goodmorning."的第一个字符'H'
1.2 分析:哪里易错
在你提供的代码片段中,char *str[3]
定义了一个包含三个元素的字符指针数组,每个元素都是一个指向字符(char
)的指针。这些指针分别初始化为指向三个字符串字面量。
现在我们具体来看 str
和 *str
在这种上下文中的含义:
1 str/*str 的指针类型、指向的类型、内部的值
- 类型:
str
是一个指针数组,其类型是char *[3]
,也就是说它是一个含有三个char *
类型元素的数组。 - 值:
str
本身代表这个数组的起始地址,即第一个指针str[0]
的地址。因此,str
可以被视为一个指向char *
类型的指针,即char **
。 - 使用场景:当你使用
str
时,你可以通过索引来访问数组中的各个指针,例如str[0]
、str[1]
和str[2]
,它们分别指向不同的字符串。
2 *str
或 str[0]
- 类型:
*str
是对str
进行一次解引用的结果。由于str
是一个char *[3]
类型的数组,*str
的类型