彻底搞懂C语言中char*与char[]的本质区别

夏知夏
夏知夏
发布时间:2026-10-15| 5人浏览过
原创

在C语言开发中,char*指针与char[]字符数组虽然常用于处理字符串且表面效果相似,但在内存布局、修改权限及生命周期上存在本质区别。本文将从指针定义、内存分配机制、const修饰规则以及sizeof与strlen的实际应用四个维度,详细拆解两者的差异与正确用法。

核心概念辨析

第1步:理解指针与数组的定义基础

目的:明确变量在内存中的基本存储形式。

入口:C语言基础语法。

动作:

  • 指针 (char*):是一个变量,其内部存储的是另一个内存单元的地址。指针本身的大小固定(32位平台为4字节,64位平台为8字节),无论它指向什么数据。
  • 数组 (char[]):是一块连续的内存空间,用于直接存储字符数据。数组名通常代表该空间的起始地址,但数组本身占有实际存储空间。

指针的“指向”是指其保存的地址中所存放数据的类型。例如,int *ptr表示ptr保存的地址对应的数据类型是整型。

第2步:掌握初始化与内存分配差异

目的:理解两者在创建时的内存行为。

操作:

char[] 数组在声明时会分配固定的内存空间,常用于需要明确缓冲区大小或进行原地修改的场景。

// char[] 初始化示例
char a[20] = "aaa";        // 分配20字节,自动填充 \0
char b[] = "bbbbb";        // 分配6字节(5个字符+\0)
char c[] = {'s','t','r','i','n','g','\0'}; // 手动指定字符序列
char d[] = {"dddd"};       // 同上

// 关键注意点:清零初始化
char num[20] = {0}; // 等价于将0~19索引全部赋值为 \0 (ASCII 0)
// 若未初始化,数组内可能残留随机垃圾值,导致字符串截断或读取错误

常用函数与操作对比

第3步:区分 sizeof 与 strlen 的运行机制

目的:避免在计算字符串长度时发生逻辑错误。

入口:<string.h> 头文件。

参数:const char*, char*, char[]。

动作与结果:

sizeofstrlen
性质编译期运算符运行时函数
功能返回对象占用的总字节数(含末尾\0及未使用空间)返回字符串有效字符数(遇到第一个\0停止,不计入\0)
典型表现sizeof(char[20]) 结果为 20
sizeof(char*) 结果为 4/8
strlen("abc") 结果为 3

第4步:正确处理地址输出与修改限制

目的:解决调试时的地址打印问题及理解常量性。

操作:

1. **输出地址**:
虽然指针名即地址,但在某些环境(如C++ cout)中直接打印可能会被视为字符串输出。建议显式转换或使用特定格式符。

const char* p = "ppp";
cout << &p << endl; // 打印指针变量本身的地址
printf("%p\n", p);    // C风格打印十六进制地址,注意不同编译器前缀可能不同

2. **修改限制**:
- char s[] = "hello";:位于栈上可修改。 - char* s = "hello";:字面量位于只读数据段,尝试修改会导致运行时崩溃(Segmentation Fault)。

第5步:理解 const 修饰规则

目的:确保代码的类型安全性。

动作:

  • const char*:指针指向的内容不可修改(const在*前)。
  • char* const:指针本身的指向不可修改(const在*后)。

总结

char * s 仅仅是一个保存字符串首地址的指针变量,而 char a[] 是由许多连续内存单元组成的实体。尽管通过传递地址可以实现相似的字符串访问效果,但二者在内存分配、读写权限及生命周期上截然不同。在实际工程中,char[]适用于需要动态写入或作为输入缓冲区的场景,而char*则多用于引用现有的只读字符串或作为函数参数传递指针。以上就是C语言中char*和char[]区别的详细内容,更多关于C语言指针与数组原理的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。