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

用超形象比喻讲清:字符、字符数组、字符串

问题:
  • 编译器不会报错,但不会强行加\0(因为格子满了)
  • 同样不是合法字符串,%s输出乱码

很多刚学 C 语言的同学,都会被这三个东西绕晕:

字符、字符数组、字符串到底有啥关系?又有啥区别?

今天不用复杂术语,就用写字、格子、句子来打比方,保证一看就懂

一、先给三个比喻,一秒看懂

  • 字符(char)单个汉字 / 单个字母就像一个字:A5

  • 字符数组(char [])一排格子一排能放很多字的格子,有没有句号都行

  • 字符串(string)带句号的一句话是一排格子 + 最后必须有一个句号('\0'),告诉程序 “这句话到这里结束了”。

二、逐个拆开讲

1. 字符 char = 单个字

它是最小单位,只能装一个字

char c;

就像:

  • 一个格子
  • 只能放一个字:'a''b''1''中'
  • 必须用单引号' '

特点:

  • 只能存一个
  • 很小,占 1 字节
  • 输出用%c

2. 字符数组 char [] = 一排格子

它是一排连在一起的格子,可以放很多字。

char str[10];

就像:[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]一共 10 个格子

你可以往里面放字:

str[0] = 'h'; str[1] = 'i';

特点:

  • 只是一排格子,不一定是一句话
  • 可以没有句号
  • 输出如果用%s,可能乱码

3. 字符串 string = 带句号的一句话

C 语言没有真正的 “字符串类型”,字符串 = 字符数组 + 最后一个格子必须是句号\0

这个句号\0就是字符串结束标志。

char str[] = "hi";

char str[] = "hi";会自动在末尾添加\0

在内存里

h i \0

就像一句话:你 好 。

特点:

  • 必须以\0结尾
  • 可以用%s整体输出
  • 可以用strlenstrcpy等函数操作

三、三者关系一句话总结

  • 字符= 一个字
  • 字符数组= 一排格子
  • 字符串= 一排格子 + 最后有个句号(\0)

不是所有字符数组都是字符串,但所有字符串都是字符数组

举例子:字符数组 ≠ 字符串

例子 1:手动初始化,没加\0(纯字符数组,不是字符串)

// 只放了2个字符,没有\0 char arr1[2] = {'h', 'i'};
问题:
  • 它只是一排格子 + 两个字,没有「句号\0
  • printf("%s", arr1)会输出乱码,程序会一直往后读内存,直到遇到随机的\0才停
  • strlen(arr1)会得到一个随机的超大数,完全错误

例子 2:数组长度不够,装不下\0(不是字符串)

问题:
  • 编译器不会报错,但不会强行加\0(因为格子满了)
  • 同样不是合法字符串,%s输出乱码

举例子:字符数组 = 字符串(合法字符串)

例子 1:自动补\0(最常用写法)

char str1[] = "hi";
  • 数组长度自动为 3,C 语言自动补\0,是标准字符串
  • 可以正常用%s输出、strlen计算长度

例子 2:手动补\0(等价写法)

char str2[3] = {'h', 'i', '\0'};
内存结构:

str1完全一致,手动加了「句号\0」,是合法字符串。

例子 3:指定长度,剩余自动补\0

char str3[10] = "hi";
内存结构:
索引0123456789
内容'h''i''\0''\0''\0''\0''\0''\0''\0''\0'
  • 剩余格子全部自动填\0,依然是合法字符串
  • strlen(str3)结果还是 2(只算到第一个\0

四、再用生活例子巩固

  • 字符:“我”
  • 字符数组:[我][爱][编][程](一排字,没句号)
  • 字符串:[我][爱][编][程][。](有结束标志,是完整句子)

程序读到(\0)就知道:“哦,这句话结束了,不用继续往下读了。”

// 字符串"hi"需要3个格子(h+i+\0),但只开了2个 char arr2[2] = "hi";
http://www.jsqmd.com/news/621967/

相关文章:

  • 【Cursor实战】AI 驱动 Chrome 插件开发:快速构建豆包图片水印清除工具
  • Pixel Script Temple C++高性能集成:开发原生推理插件提升生成速度
  • 【AI原生研发技术栈终极指南(2026权威版)】:覆盖LLM编排、Agent框架、RAG基建、模型微调与可观测性全链路选型决策树
  • Qwen3.5-2B轻量化优势详解:相比Qwen3.5-8B显存降低62%,精度保留94%
  • Dify知识库文件上传API深度解析:从参数校验到异步索引构建
  • 【Spring Boot 4.0 Agent-Ready 架构性能调优白皮书】:20年专家亲授5大JVM级优化策略,上线QPS飙升370%
  • SD1.5经典模型快速体验:免配置镜像实测,附赠JSON参数复现秘籍
  • java项目-基于SpringBoot+Vue前后端分离的在线考试系统设计与实现(附资料)
  • Cursor Skills保姆级安装与避坑指南:从npx命令到本地.cursor文件夹配置
  • 数据采集分享--爬⾍基础知识
  • Phi-4-reasoning-vision-15B多场景实践:研发/测试/产品/运营人员协同使用
  • S2-Pro数据库智能问答系统:基于自然语言的SQL生成与优化
  • 从零到一:利用ThinkPHP漏洞实现RCE攻击实战解析
  • 告别网络依赖:聊聊鸿蒙Flutter混合开发中,离线语音交互的几种实现方案与选型思考
  • 微软TTS神器VibeVoice上手实测:一键生成多角色对话,效果惊艳
  • IC617 Virtuoso环境配置与SMIC18MMRF工艺库加载全流程解析
  • 智能语音技术(七)
  • 免费且强大!QWEN-AUDIO智能语音合成系统体验报告:从部署到创意应用
  • C++高性能客户端开发:直接调用Pixel Script Temple的ONNX运行时
  • 金融行业AI落地:风控、投顾、合规三大核心场景实战
  • intv_ai_mk11参数详解教程:max_length=2048如何影响长文档总结完整性与截断风险
  • Django REST Framework 中实现用户资料更新的完整实践指南
  • EcomGPT-7B电商大模型一键部署教程:3步搞定Linux系统环境配置
  • Qwen3.5-4B模型Node.js环境配置与项目初始化一键脚本生成
  • 提示词零样本和少样本分析对比
  • 什么是张量库
  • Wan2.2-I2V-A14B多场景落地:高校思政课教学动画智能生成平台
  • 重装系统后的第一件事:部署你的专属AIGC绘画工具
  • 用Multisim搞定LM324带通滤波器:从理论计算到仿真调试的完整避坑指南
  • NEURAL MASK幻镜零基础教程:无需PS经验,3分钟掌握专业级主体剥离