char *s VS char s[]

c++
c, c++

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

1
2
char s1[] = "hello"; //定义一个字符数组
char *s2 = "hello"; //定义一个指向字符串常量"hello"的指针

在这里,s1 = &s1[0], s1是个”常量”,始终等于&s1[0],无法更改。s2是个指针变量.

1
2
3
4
5
6
7
8
9
10
11
#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],不可以修改。
大概就这么几个区别。