char * pChar = “World“;和char aChar[20] = “World“;的差异

书籍:《Visual C++ 2017从入门到精通》的2.7 字符串

环境:visual studio 2022

内容:(15)char*转为CString

在C语言中,char *pChar = "World"; 和 char aChar[20] = "World"; 的差异主要体现在内存分配、可修改性、类型特性等方面。以下是详细分析:


1. 内存分配方式

  • ​**char *pChar = "World";**
    pChar 是一个指向字符串常量的指针,字符串 "World" 存储在只读内存区域(常量区),pChar 仅保存该区域的地址。

    特点
    • 字符串内容不可修改(尝试修改会引发段错误)。
    • 指针本身是变量,可重新赋值指向其他地址。
  • ​**char aChar[20] = "World";**
    aChar 是一个字符数组,数组元素存储在栈上,内容可读写

    特点
    • 数组大小固定为20字节(包括终止符\0),剩余空间可自由修改。
    • 数组名 aChar 本身是地址常量,不可重新赋值。

2. sizeof 运算符结果

  • ​**sizeof(pChar)** 返回指针的大小(通常为4或8字节,取决于系统)。
  • ​**sizeof(aChar)** 返回数组总大小,即20字节。

3. 内容修改的安全性

  • ​**pChar**:
    尝试修改字符串内容(如 pChar[0] = 'W';)会导致未定义行为(如段错误),因字符串常量受保护。
  • ​**aChar**:
    可直接修改数组元素(如 aChar[0] = 'W';),支持 strcat 等操作。

4. 类型与函数参数传递

  • 数组与指针的关系
    数组名在大多数场景下退化为指针,但两者本质不同。例如:

    char a[] = "Hello";
    char *p = a; // p指向a的首地址,可修改a的内容

    但 sizeof(a) 为6(含\0),而 sizeof(p) 为指针大小。

  • 函数参数传递

    • 数组作为参数时退化为指针,丢失长度信息(需显式传递长度或使用终止符)。
    • 指针传递则始终是地址,无法获取原数组大小。

5. 适用场景

  • ​**char *pChar**:
    适用于指向动态分配内存、常量字符串或需要灵活修改指针的场景。
  • ​**char aChar[]**:
    适用于需要固定大小、可修改内容的字符串操作(如局部变量、缓冲区)。

总结对比表

特性 char *pChar char aChar[20]
内存区域 常量区(只读) 栈(可读写)
内容可修改性 不可修改(尝试会崩溃) 可修改
sizeof 结果 指针大小(4/8字节) 数组总大小(20字节)
函数参数行为 退化为指针,丢失长度信息 退化为指针,但可结合其他方式传递长度
典型用途 指向常量字符串、动态内存 局部字符串存储、缓冲区操作

扩展建议

  • 现代C++推荐:使用 std::string 替代C风格字符串,避免手动管理内存和溢出风险。
  • 安全操作:若需修改字符串,优先使用字符数组或动态分配内存(如 malloc),并始终检查边界。

你可能感兴趣的:(Visual,C++,2017,从入门到精通,mfc)