char *name[5] 和 char name[5][9]
- 相同之处
name 都是二级指针,*name 都表示一级指针,**name 都表示存储的字符内容。 - 不同之处
注:char * s[] 是字符指针数组,数组元素是字符指针,s[i]是一级字符指针,指向常量字符串。
问题发现
我自己写了一个void reverse(char *s)
函数,用于逆置字符串(除了末尾的'\0'
),传递的参数为字符指针:
void reverse(char *s){
char temp;
for(int i = 0; i < strlen(s); i++){
temp = s[i];
s[i] = s[strlen(s) - 1 - i];
s[strlen(s) - 1 - i] = temp;
}
}
但是效果并不理想 —— 压根儿就没有逆置,甚至运行出错。后来一番摸索,发现是字符数组和字符指针的问题:使用字符数组形式的字符串逆置即可马上得到正确答案,但是使用字符指针指向的字符串却得不到任何结果。
解决方法就是形式对应
在字符指针指向的字符串中,要使用指针语言来解决遍历问题:
*(s + i) //相对于s首地址的偏移量,即 s[i]
正确写法:
//字符数组
void reverse(char s[]){
char temp;
for(int i = 0; i < strlen(s); i++){
temp = s[i];
s[i] = s[strlen(s) - 1 - i];
s[strlen(s) - 1 - i] = temp;
}
}
//指向字符串的指针
void reverse(char *s){
char temp;
int len = strlen(s);
for(int i = 0; i < len / 2; i++){
temp = *(s + i);
*(s + i) = *(s + len - 1 - i);
*(s + len - 1 - i) = temp;
}
}