news 2026/8/15 12:59:47

98.C语言易混难点:字符数组与字符串指针的底层差异

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
98.C语言易混难点:字符数组与字符串指针的底层差异

一、两种写法的直观对比

我们先看两个最常见的字符串定义:

char s[] = "hello"; // 字符数组 char *p = "hello"; // 字符串指针

从表面上看,二者都能通过printf("%s", s)printf("%s", p)打印出hello,但它们的底层存储位置、修改权限完全不同:

  • char s[]:在栈上分配数组空间,字符串内容会被拷贝到数组中,可以修改
  • char *p:指针变量保存在栈上,指向只读的字符串常量区,强行修改会导致程序崩溃

二、字符数组:拥有独立存储空间

字符数组的本质是在栈上开辟一块连续的内存空间,将字符串常量的内容拷贝到这块空间中。因此,数组拥有这块内存的所有权,可以自由修改其中的字符。

示例代码

#include <stdio.h> int main() { char s[] = "hello"; s[0] = 'H'; // 可以修改数组中的字符 printf("%s\n", s); // 输出:Hello return 0; }

底层逻辑

  • 栈上分配6字节空间(hello\0)。
  • 字符串常量"hello"的内容被拷贝到数组中。
  • 数组名s是这块内存的首地址,修改s[0]会直接修改数组中的内容。

三、字符串指针:指向只读常量区

字符串指针的本质是在栈上分配一个指针变量,保存字符串常量的首地址。而字符串常量本身存储在只读的常量区,不允许修改。

错误示例(会导致崩溃)

#include <stdio.h> int main() { char *p = "hello"; p[0] = 'H'; // 危险!修改只读常量区,程序会崩溃 printf("%s\n", p); return 0; }

底层逻辑

  • 栈上分配8字节(64位系统)的指针变量p
  • 字符串常量"hello"存储在只读的常量区,p保存其首地址。
  • 尝试修改p[0]会触发段错误,因为常量区的内存是只读的。

四、核心差异对比表

特性char s[] = "hello"char *p = "hello"
存储位置栈上数组空间栈上指针 + 常量区字符串
所有权数组拥有内容所有权指针仅保存地址,无所有权
修改权限可以自由修改禁止修改,修改会崩溃
适用场景需要修改字符串内容仅需读取字符串内容

五、正确使用建议

1. 需要修改字符串时,优先使用字符数组

如果后续需要修改字符串内容,必须使用字符数组,并提前分配足够的空间:

#include <stdio.h> #include <string.h> int main() { // 分配20字节空间,足够容纳修改后的字符串 char s[20] = "hello"; s[0] = 'H'; strcat(s, " C"); // 拼接字符串 printf("%s\n", s); // 输出:Hello C return 0; }

2. 仅需读取字符串时,可使用指针

如果只是需要读取字符串内容,使用指针更节省栈空间:

#include <stdio.h> int main() { const char *p = "hello"; // 加const更安全,防止误修改 printf("%s\n", p); // 输出:hello return 0; }

六、一句话总结

字符数组和字符串指针的核心差异,不在于能否打印字符串,而在于谁拥有这块字符空间

  • 数组有自己的存储空间,内容可以修改;
  • 指针仅保存常量区的地址,内容禁止修改。

在实际开发中,务必根据需求选择合适的写法,避免因混淆二者导致程序崩溃。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 12:59:13

三步搞定DLSS版本升级:我用DLSS Swapper告别糊画面的完整教程

三步搞定DLSS版本升级&#xff1a;我用DLSS Swapper告别糊画面的完整教程 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你有没有过这样的瞬间&#xff1a;明明把画质选项拉到了最高&#xff0c;屏幕里的远景却还是糊…

作者头像 李华
网站建设 2026/8/15 12:57:54

深耕液压配套服务赛道,打通设备稳定运行最后一公里

一、液压系统&#xff1a;工业设备的动力心脏在工程机械、橡塑机械、冶金机床、环卫设备、农业机械、船舶机械等诸多工业场景中&#xff0c;液压系统是整套设备的核心“动力心脏”与“传动血脉”。设备的作业效率、运行稳定性、故障频次、使用寿命&#xff0c;都与液压配件、液…

作者头像 李华
网站建设 2026/8/15 12:57:46

3 分钟导出全成就:YaeAchievement 原神成就数据导出工具实战手册

3 分钟导出全成就&#xff1a;YaeAchievement 原神成就数据导出工具实战手册 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 凌晨一点半&#xff0c;阿澈对着浏览器里的成就列表&#xff0…

作者头像 李华
网站建设 2026/8/15 12:55:19

Adobe破解工具完整上手:5步跑通Adobe全家桶免费激活全流程

Adobe破解工具完整上手&#xff1a;5步跑通Adobe全家桶免费激活全流程 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 如果你正被 Adobe 的订阅账单劝退&#xff0c…

作者头像 李华
网站建设 2026/8/15 12:52:52

AI Agent从无到有19:LangChain 核心模块与首个链式应用实战

纲要 环境准备与基础依赖 Python 版本要求与虚拟环境配置核心依赖包&#xff1a;langchain、langchain-openai、langchain-core、python-dotenv环境变量配置&#xff1a;OPENAI_API_KEY 与 OPENAI_BASE_URL LangChain 三大基础模块 大模型组件&#xff08;ChatOpenAI&#xff…

作者头像 李华