本文最后更新于 2026-02-27,文章内容可能已经过时。

C语言字符串常量是用双引号(" ")定义的字符序列,存储时自动在末尾添加\0结束符,因此长度为实际字符数+1;它们存储在只读内存区(如RODATA),不可修改(尝试修改会导致未定义行为),与单引号表示的字符常量(长度恒为1)不同,字符串常量可正确用于初始化字符数组(如char s[] = "hello";)或赋值给字符指针(如char *p = "hello";),但不能直接赋值给字符数组变量(如char arr[5]; arr = "hello";会报错)。

定义

字符串常量是用双引号(" ")括起来的0个或多个字符组成的序列。例如:

  • "Hello, World!"
  • "a"
  • " "(空格字符串)
  • ""(空字符串)

存储方式

  • 字符串常量在内存中以字符数组形式存储
  • 系统会在字符串末尾自动添加一个'\0'(空字符)作为字符串结束标志
  • 字符个数为n的字符串在内存中占(n+1)个字节

与字符常量的区别

特性字符常量字符串常量
定界符单引号 '双引号 "
长度1个字符n+1个字符(n为字符个数)
存储存储字符的ASCII码值存储字符及结尾的'\0'
示例'A'"A"(长度为2)

重要特性

1. 不可修改性

  • 字符串常量在定义后不可修改
  • 它们存储在只读内存区(RODATA)
  • 尝试修改字符串常量会导致程序崩溃或未定义行为

2. 与字符数组的关系

  • 正确方式char str[] = "hello";(数组初始化)
  • 错误方式char str[6]; str = "hello";(不能直接赋值字符串常量给数组)

3. 与指针的关系

  • 字符串常量会生成"指向字符的常量指针"
  • 可以将字符串常量赋值给字符指针:char *p = "hello";
  • 但不能将字符串常量赋值给字符数组:char arr[5]; arr = "hello";(会报错)

常见用法示例

1. 字符串输出

#include <stdio.h>
int main() {
    printf("Hello, World!\n");  // 输出字符串
    printf("Hello\nWorld");      // \n表示换行
    return 0;
}

2. 字符串处理函数(需包含string.h)

#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello";
    char str2[20] = "World";
    
    // 字符串连接
    strcat(str1, " ");  // str1现在为"Hello "
    strcat(str1, str2); // str1现在为"Hello World"
    
    // 字符串比较
    if(strcmp(str1, "Hello World") == 0) {
        printf("Strings are equal\n");
    }
    
    // 获取字符串长度(不包括'\0')
    printf("Length: %d\n", strlen(str1)); // 输出 11
    
    return 0;
}

3. 字符串常量的转义字符

#include <stdio.h>
int main() {
    printf("Hello\tWorld\n");  // \t表示制表符
    printf("Line1\nLine2\n");  // \n表示换行
    printf("This is a \"quote\".\n"); // \"表示双引号
    return 0;
}

重要注意事项

  1. 字符串常量长度:字符串"F"在内存中存储为'F''\0',长度为2,不是1。

  2. 空字符串""表示空字符串,长度为0,但内存中仍包含一个'\0'

  3. 字符串与字符数组的初始化

    char s1[] = "hello";    // 自动分配6个字节
    char s2[6] = "hello";   // 显式分配6个字节
    char s3[5] = "hello";   // 错误,长度不足
    
  4. 字符串常量的指针赋值

    char *str = "Hello";    // 正确,str指向字符串常量
    str[0] = 'h';           // 错误!尝试修改字符串常量
    

字符串常量是C语言中处理文本信息的基础,正确理解其特性和用法对编写可靠的C程序至关重要。