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

第三章:C 语言基础概念 —— 变量与数据类型

前言

欢迎来到第三章!

在上一章中,我们认识了一个 C 程序的完整结构:头文件、主函数、语句。但我们写的程序都是 "固定的"—— 输出什么内容在写代码的时候就定死了。

如果我想让程序 "记住" 一些东西呢?比如用户输入的数字、计算的中间结果,这时候就需要变量了。

而变量又有不同的类型—— 有的存整数,有的存小数,有的存字符,为什么要分这么多种类型?每种类型有什么特点?

本章我们就来搞清楚这两个最重要的基础概念:

  • 什么是变量?变量怎么用?
  • 什么是数据类型?C 语言有哪些基本类型?

这一章是后面所有内容的基础,一定要吃透哦~

一、什么是变量?

1.1 变量的通俗理解

变量,就是一个有名字的 "盒子",用来存放数据。

想象一下:

  • 你有一个盒子,上面贴着标签叫age
  • 你往盒子里放了一个数字:18
  • 后来你又把 18 拿出来,换成了 20
  • 这个盒子里的东西是可以的,所以叫
int age = 18; // 造一个叫age的盒子,放进去18 age = 20; // 把盒子里的东西换成20

1.2 变量的本质:内存

从计算机底层来看,变量本质上就是一块内存空间

  • 内存就像一个大仓库,被分成了一个个小格子
  • 每个小格子都有一个地址(门牌号)
  • 变量就是给某一块内存空间起了个名字
  • 通过这个名字,我们就能读写这块内存里的数据
内存地址: 0x100 0x101 0x102 0x103 ... ┌─────┬─────┬─────┬─────┐ 数据: │ 18 │ │ │ │ ... └─────┴─────┴─────┴─────┘ ↑ 变量age指向这里

不过对初学者来说,不用太纠结底层细节,先记住 "变量就是装数据的盒子" 就够了。

1.3 为什么需要变量?

你可能会问:直接写数字不行吗?为什么还要用变量?

因为变量有三大好处:

① 方便修改

// 如果不用变量,想改年龄得改好几个地方 printf("我今年18岁\n"); printf("明年我就19岁了\n"); printf("18岁正是好年纪\n"); // 用变量的话,改一处就行 int age = 18; printf("我今年%d岁\n", age); printf("明年我就%d岁了\n", age + 1); printf("%d岁正是好年纪\n", age);

② 保存中间结果

// 计算长方形面积,把结果存起来后面用 int width = 5; int height = 3; int area = width * height; printf("面积是:%d\n", area);

③ 接收用户输入

int num; scanf("%d", &num); // 把用户输入的数字存到num变量里

简单说:有了变量,程序才能 "记住" 东西,才能 "活" 起来。


二、什么是数据类型?

2.1 为什么要有类型?

你可能又会问:变量就是装数据的盒子,那所有盒子都一样大不行吗?为什么还要分类型?

因为不同的数据,需要的空间大小不一样:

  • 一个整数,可能 4 个字节就够了
  • 一个小数,可能需要 8 个字节
  • 一个字符,1 个字节就够了

如果所有盒子都按最大的做,就会浪费空间。就像你不会用行李箱装一支笔一样 —— 大材小用。

所以 C 语言把数据分成了不同的类型,每种类型:

  • 占用的内存大小不同
  • 能表示的数值范围不同
  • 支持的运算也不同

2.2 C 语言的基本数据类型

C 语言的基本数据类型主要分三大类:

类型分类关键字用途
整型intshortlonglong long存整数(正整数、负整数、零)
字符型char存单个字符(字母、数字、符号)
浮点型floatdoublelong double存小数

还有一个特殊的void类型,表示 "什么都没有",后面讲函数的时候会遇到。

下面我们一个一个来讲。


三、整型(整数类型)

3.1 int:最常用的整型

int是最常用的整数类型,全称是 integer(整数)。

int age = 18; // 正整数 int temperature = -5; // 负整数 int zero = 0; // 零

int通常占用4 个字节(32 位),能表示的范围大约是:

  • -2,147,483,648 到 2,147,483,647

对初学者来说,int基本够用了,平时写代码用int就行。

3.2 其他整型

除了int,还有几种整型,各有不同的大小:

类型通常大小位数范围(2 的次方表达)范围(数值)说明
short2 字节16 位-2¹⁵ ~ 2¹⁵ - 1-32,768 ~ 32,767短整型
int4 字节32 位-2³¹ ~ 2³¹ - 1-2,147,483,648 ~ 2,147,483,647最常用,整型默认
long4 或 8 字节32 或 64 位至少 -2³¹ ~ 2³¹ - 1至少正负 21 亿长整型,平台相关
long long8 字节64 位-2⁶³ ~ 2⁶³ - 1-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807更长的整型

简单记:越往后,能存的数越大,但占用的空间也越多。

💡新手提示:初学阶段你就放心用int,基本不会出错。等后面遇到 "数字太大装不下" 的情况,再考虑用long long

3.3 有符号和无符号

默认情况下,整型是有符号的 —— 既能存正数,也能存负数。

如果你确定只存非负数(0 和正整数),可以加unsigned关键字,变成无符号整型:

unsigned int age = 18; // 无符号整型,只能存0和正数

无符号的好处是:正数范围更大了(因为不用给负数留位置了)。

比如unsigned int的范围就是0 到 4,294,967,295

四、字符型(char)

4.1 char:存单个字符

char是字符类型,用来存单个字符—— 比如一个字母、一个数字、一个符号。

char grade = 'A'; // 大写字母 char ch = 'a'; // 小写字母 char digit = '5'; // 数字字符(注意和数字5不一样!) char symbol = '@'; // 符号

⚠️注意:字符要用单引号' '包起来,不是双引号!

'A'是一个字符

"A" 是一个字符串(后面会讲)

4.2 char 的本质:ASCII 码

虽然char叫 "字符型",但它本质上也是一个整数 —— 每个字符对应一个数字编号,这就是ASCII 码

所以char其实就是一个比较小的整型,通常占1 个字节,范围是 -128 ~ 127。

你甚至可以把它当整数用:

char c = 'A'; printf("%c\n", c); // 输出字符:A printf("%d\n", c); // 输出ASCII码:65

运行结果:

A 65

很神奇吧?字符和数字在底层是相通的。

💡小技巧:小写字母比对应的大写字母大 32。比如 'a'-'A'= 32。记住这个,后面写大小写转换的代码会用到。


五、浮点型(小数类型)

5.1 float 和 double

浮点型就是用来存小数的,也叫实数类型。

C 语言有三种浮点型:

表格

类型通常大小精度说明
float4 字节约 6~7 位有效数字单精度浮点
double8 字节约 15~16 位有效数字双精度浮点,最常用
long double8 或 16 字节更高精度长双精度,很少用

简单说:doublefloat更精确,占用空间也更大。

5.2 怎么用?

float pi = 3.14f; // float类型,后面加个f double height = 1.75; // double类型,最常用

💡新手提示:写小数的时候,默认是double类型。如果要表示float,后面要加fF。初学阶段建议直接用double,精度高,也不用纠结后缀。

5.3 输出浮点型

输出浮点型用%f格式控制符:

double pi = 3.1415926; printf("π = %f\n", pi);

输出:

π = 3.141593

默认会输出 6 位小数。如果想控制小数位数,可以这样写:

printf("π = %.2f\n", pi); // 保留2位小数 printf("π = %.4f\n", pi); // 保留4位小数

输出:

π = 3.14 π = 3.1416

⚠️注意:浮点数有精度问题,不能精确表示所有小数。比如 0.1 在二进制里是无限循环小数,存的时候会有微小误差。初学阶段不用太纠结,知道有这回事就行。


六、变量的声明和使用

6.1 如何声明变量

使用变量之前,必须先声明(也叫定义)。

声明变量的语法:

类型名 变量名;

比如:

int age; // 声明一个int类型的变量,叫age double height; // 声明一个double类型的变量,叫height char grade; // 声明一个char类型的变量,叫grade

声明变量的意思就是:"我要一个盒子,类型是 XX,名字叫 XX。"

6.2 初始化

声明变量的时候,可以直接给它赋值,这叫初始化

int age = 18; // 声明的同时初始化 double pi = 3.14; // 声明的同时初始化 char c = 'A'; // 声明的同时初始化

也可以先声明,后赋值:

int age; // 先声明 age = 18; // 后赋值

⚠️重要提醒:局部变量如果不初始化,里面的值是随机的、不确定的!千万不要直接用未初始化的变量,否则结果会很奇怪。一定要养成 "声明就初始化" 的好习惯。

6.3 变量命名规则

给变量起名字要遵守几个规则:

可以用

  • 字母(a-z, A-Z)
  • 数字(0-9)
  • 下划线(_)

不能用

  • 不能以数字开头
  • 不能有空格、加减乘除等特殊符号
  • 不能是 C 语言的关键字(比如intiffor这些)

另外,C 语言区分大小写ageAge是两个不同的变量。

6.4 命名建议

语法是底线,更重要的是起一个好名字

好的命名

int age; // 年龄 int student_age; // 学生年龄 double price; // 价格 char grade; // 等级

不好的命名

int a; // 鬼知道a是什么 int nianling; // 用拼音?不专业 int sAge; // 什么意思? int _123; // 虽然合法,但看不懂

💡经验之谈:好的变量名应该 "见名知意"—— 别人一看名字就知道这个变量是干什么的。命名是程序员的基本功,从第一天开始就要养成好习惯。


七、综合示例

学了这么多,让我们来看一个完整的例子,把变量和类型都用起来:

#include <stdio.h> int main() { // 声明各种类型的变量并初始化 int age = 18; char grade = 'A'; double height = 1.75; float weight = 65.5f; // 输出各个变量的值 printf("年龄:%d岁\n", age); printf("等级:%c\n", grade); printf("身高:%.2f米\n", height); printf("体重:%.1f公斤\n", weight); // 修改变量的值 age = age + 1; // 年龄加1 printf("明年我就%d岁了\n", age); return 0; }

运行结果:

年龄:18岁 等级:A 身高:1.75米 体重:65.5公斤 明年我就19岁了

每一行的作用都看懂了吗?

⚠️ 关于本文

由于笔者水平有限,文中难免存在疏漏、错误或表述不够准确的地方。如果你在阅读过程中发现了任何问题 —— 无论是概念错误、代码 bug、还是表述不清 —— 都欢迎在评论区留言指正,我会及时修正。

技术之路,道阻且长,行则将至。我们互相学习,共同进步 💪

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

相关文章:

  • Spring Boot Actuator 暴露 heapdump,内存里的密码可能全漏了
  • 英雄联盟自动化工具终极手册:全面提升你的游戏体验
  • 可视化任务与分析(学习笔记)
  • heap 0 题解
  • 影刀RPA实操教程:5个真实案例带你从入门到独立开发
  • Spring Data Commons CVE-2018-1273漏洞剖析:SpEL表达式注入与RCE实战
  • 【硬件+APP+云平台】29.1.智能头盔-WiFi-基于STM32嵌入式物联网单片机软硬件毕业生系统设计
  • Agent 记忆长期化:从短期上下文到持久知识库的架构设计
  • MediaCrawler多平台数据采集框架:新媒体数据分析技术方案
  • QQ群数据采集神器:3分钟批量获取精准社群信息的完整指南
  • 嵌入式智能散热系统设计与PID温控算法实现
  • 【最全亲测】Hermes桌面版安装、使用
  • 用 100 行代码手搓一个 MCP Server,让 LLM 直接读你本地文件
  • 为什么选择openEuler/ci-bot?5大核心优势助力开源项目高效协作
  • 北京通州有哪些值得推荐的学画画的美术机构?
  • Hermes \+ Upstash 全栈组合实战指南: 免费层搭生产级持久化层
  • 2026年影石创新嵌入式岗位面试题带参考答案
  • CloudFormation Stack 概念全解析:从资源集合到自动化编排的核心引擎
  • 鸿蒙三方库 | harmony-utils之AppUtil.init全局初始化
  • 有一个很好的思路记录一下,创建一个辅助学习的skill
  • HarmonyOS ArkTS 实战|中式美食用户行为数据:Preferences 持久化、搜索缺口与候选排序
  • 类与对象:蓝图和房子的关系
  • Spark 流式处理:从入门到实战
  • EMA 指数移动平均 PyTorch 实现:3 种主流框架集成方案与性能开销实测
  • 2026年最新八字排盘应用推荐:天乙八字排盘、命枢、问真八字等怎么选?
  • 万能密码漏洞:认证逻辑缺陷的深度剖析与防御实践
  • 【JavaWeb】三大组件之——Servlet
  • pandas删列原理与性能优化:BlockManager、内存拷贝与CoW机制解析
  • 5分钟快速上手TEdit:泰拉瑞亚地图编辑器的终极指南
  • 深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质