char *s VS char s[]

c++
c++, c

可能有些人不会注意二者的区别,举几个例子说明.

1
2
3
char s1[] = "hello";     //定义一个字符数组
char *s2 = "hello";      //定义一个指向字符串常量"hello"的指针
``` 在这里,s1 = &s1[0], s1是个”常量”,始终等于&s1[0],无法更改。s2是个指针变量.
``` #include <iostream> #include <cstdio> using namespace std; int main() { char s1[] = "hello"; char *s2 = "hello"; cout << sizeof(s1) << endl; //输出6,表示数组s1所占的字节 cout << sizeof(s2) << endl; //输出4,表示指针变量s2是4个字节 return 0; }

赋值上,可以这么使用s2 = s1, 但是不能s1 = s2,以为上面说过s1恒等于&s1[0]无法改变,所以不可以这么赋值。
也可以这么用s1[0] = ‘a’,因为s1本身就是字符数组,可以更改其中的内容。
但是不可以s2[0] = ‘a’, 因为s2指向一个字符串常量,不可以修改这个常量。
遍历字符串时,可以用s2++,因为指针变量可以修改,但是不能这s1++遍历字符串,因为上面说了s1恒等于&s1[0],不可以修改。
大概就这么几个区别。