char *s 与char s[]的差别

char *s 与char s[]的区别

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

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],不可以修改。

大概就这么几个区别。