当前位置: 首页 > news >正文

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; }

六、一句话总结

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

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

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

http://www.jsqmd.com/news/1398337/

相关文章:

  • 核心语法篇,判断循环选择语句的学习
  • 终极AMD Ryzen调试指南:免费开源SMUDebugTool从零到进阶
  • Echarts折线图进阶配置:从基础到专业的视觉与交互优化指南
  • Python构建语言AI模型的核心技术与实践
  • CoreWeave崛起背后:AI原生基础设施如何重塑GPU云服务与Kubernetes实践
  • 深度解析 PVC材质通风管道:特性、定制工艺与应用 - 汇聚至此
  • 避坑!抖店新人专用铺货系统,适配1688代发,多店铺批量操作省时省力 - 抖大侠
  • 京东 算法实习一面 上
  • Grok Bot实战:构建AI智能体团队实现自动化协作与运维
  • 经典游戏兼容神器 DDrawCompat:一个 DLL 文件解决老游戏花屏与闪退难题
  • 3分钟告别百度网盘龟速:pdown下载器免登录粘贴链接即享高速
  • SetDPI快速上手指南:一招解决Windows多显示器DPI缩放不一致
  • IPXWrapper 零基础实战指南:一招让《红警2》《暗黑1》老游戏在现代 Windows 上恢复局域网联机
  • Pycharm解释器配置问题解决
  • Ubuntu 20.04光标自定义全攻略:从基础设置到Java应用问题解决
  • 从“心海贴贴”现象解析游戏角色设计的情感共鸣方法论
  • 告别灰扑扑的任务栏:Windows 透明任务栏美化工具 TranslucentTB 完整上手教程
  • OpenAI API限额重置:ChatGPT与Codex用量配额调整与验证指南
  • 企业级AI编码平台六层架构设计:从安全合规到效能优化
  • 耐高温通风管道定制常见问题解答(2026专家版) - 汇聚至此
  • 2026秦皇岛高价回收赛琳包包的靠谱商家 毓典奢品汇13103017712 高价回收专业靠谱 - 毓典奢侈品回收
  • 杭州二手钻石回收认准奢二网 连锁品牌 透明检测无隐形扣费 - 每日小知识
  • Keil音乐挂件:用PWM方波驱动蜂鸣器播放音乐的嵌入式实践
  • 抖音批量下载工具 douyin-downloader 完整指南:从单视频到作者主页全量采集
  • 三分钟搞定标签打印:用免费开源的 LPrint 让标签打印机不再挑系统
  • 极限竞速地平线5修改器 Forza Mods AIO 完整上手指南:地平线4/5免费功能增强工具怎么用
  • AI落地实战:避开五大深坑,从玩具到生产力工具的跨越
  • 投研效率提升300%:金融智能投研Agent全链路搭建实战
  • 微信公众号数据采集实战指南:10分钟用Python爬虫搭建公众号监控工具
  • 京东 算法实习一面 下+手撕