且听风吟

Don't panic! I'm a programmer.

C语言字符串定义与初始化

| Comments

字符串的两种定义方式

  1. char数组

    char sa[] = “hello world”;

  2. char指针

    char *sp = “hello world”;

这两种方式都产生了一个”hello world”的字符串常量,字符串常量存储在静态存储区中,静态存储区中的内容在程序运行的整个过程中都存在,而且只存储一份。

数组与指针的关系

在第一种定义中,字符串常量在编译时就已经分配好了空间,但直到运行时才会为数组分配存储空间,这时,存储在静态存储区中的字符串常量会被拷贝一份到数组中,此后,数组名sa与&sa[0]等价。重要的是,sa是一个常量,你不能修改sa的值,你可以通过sa+1来标识数组里的下一个元素,也可以修改数组里的元素。然而,sa++是不允许的,因为自增运算符只能作用于变量而不是常量。

第二种定义中,程序运行时只为指针变量sp分配了存储空间,用来字符串常量”hello world”的地址,这时,字符串常量没有被拷贝。sp的值是可以改变的,如++sp将指向字符e。

总之,数组初始化是从静态存储区中把一个字符串拷贝给数组,而指针初始化只是复制这个字符串的地址。

示例

#include <stdio.h>

int main(int args, char **argv) {
    char sa[] = "hello world";
    char *sp = "hello world";

    // sa++; 错误,sa是常量
    sp++;

    sa[1] = 'M';
    *(sa+2) = 'X';
    // sp[1] = 'M'; // 错误,不能修改常量值

    printf("%s\n", sa);
}