前言
C语言最核心、最必备的五大基础模块:变量与数据类型、流程控制、数组、函数、指针。
包含:概念讲解 + 语法规则 + 完整可运行代码 + 实战案例 + 易错点总结,完全适配入门学习、笔记复盘、吃透本文即可夯实C语言所有底层基础。
适合人群:C语言零基础、初学入门、基础薄弱需要系统复盘的开发者。
一、C语言基础核心:变量与数据类型
1.1 什么是变量?
变量是计算机内存中临时存储数据的容器,程序运行过程中,变量的值可以随时修改。
简单理解:内存就是仓库,变量就是仓库里的箱子,箱子可以存放不同的数据,也可以更换数据。
1.2 变量三要素
-
数据类型:规定变量存储的数据种类(整数、小数、字符)
-
变量名:变量的唯一标识,用于操作变量
-
变量值:变量内存中存储的真实数据
1.3 常用基础数据类型
|
char |
1字节 |
单个字符/字母/符号 |
-128 ~ 127 |
|
short |
2字节 |
短整数 |
-32768 ~ 32767 |
|
int |
4字节 |
普通整数(最常用) |
-2147483648 ~ 2147483647 |
|
long |
4/8字节 |
长整数 |
大于int范围 |
|
float |
4字节 |
单精度小数 |
6~7位有效数字 |
|
double |
8字节 |
双精度小数(常用) |
15~16位有效数字 |
1.4 变量定义与初始化语法
// 先定义,后赋值
数据类型 变量名;
变量名 = 值;
// 定义并直接初始化(推荐写法)
数据类型 变量名 = 值;
1.5 完整实战代码
#include <stdio.h>
int main()
{ // 定义并初始化不同类型变量
char ch = 'A';
int num = 100;
float score = 95.5f;
double price = 19.99;
// 打印变量值
printf("字符变量:%c\\n", ch);
printf("整型变量:%d\\n", num);
printf("单精度小数:%f\\n", score);
printf("双精度小数:%lf\\n", price);
// 修改变量值
num = 200;
printf("修改后的整型变量:%d\\n", num);
return 0;
}
1.6 变量命名规则(必记)
只能由字母、数字、下划线组成
不能以数字开头
不能使用C语言关键字(int、char、if、for等)
区分大小写(num 和 Num 是两个不同变量)
命名尽量见名知意,提高代码可读性
1.7 常量介绍
常量是值不可修改的量,分为字面常量和宏常量:
#include <stdio.h>
#define PI 3.14159 // 宏常量,全局有效
int main()
{
const int YEAR = 2026;
// 只读常量
printf("圆周率:%f\\n", PI);
printf("年份:%d\\n", YEAR);
return 0;
}
二、流程控制(if/else、switch、for、while、do-while)
流程控制是程序的逻辑骨架,C语言程序默认从上到下顺序执行,通过流程控制可以实现:条件判断、循环执行、逻辑跳转。
2.1 分支结构(条件判断)
2.1.1 if-else 条件语句
适用场景:区间判断、多条件判断、复杂逻辑判断
语法:
// 单分支
if(条件表达式)
{
满足条件执行的代码;
}
// 双分支
if(条件表达式)
{
条件成立执行;
}else{
条件不成立执行;
}
// 多分支
if(条件1)
{
条件1成立执行;
}else if(条件2){
条件2成立执行;
}else{
所有条件不成立执行;
}
实战案例:成绩等级判断
#include <stdio.h>
int main()
{
int score;
printf("请输入考试成绩:");
scanf("%d", &score);
if(score >= 90)
{
printf("优秀\\n");
}else if(score >= 80){
printf("良好\\n");
}else if(score >= 60){
printf("及格\\n");
}else{
printf("不及格\\n");
}
return 0;
}
2.1.2 switch 分支语句
适用场景:固定值匹配(不适合区间判断)
语法规则:
-
表达式结果必须是整型/字符型
-
case 后为固定常量值
-
必须加break,否则会穿透执行
-
default 为可选,匹配所有不满足的情况
实战案例:星期判断
#include <stdio.h>
int main()
{
int day;
printf("请输入星期数字(1-7):");
scanf("%d", &day);
switch(day)
{
case 1:
rintf("星期一\\n");
break;
case 2:
printf("星期二\\n");
break;
case 3:
printf("星期三\\n");
break;
case 4:
printf("星期四\\n");
break;
case 5:
printf("星期五\\n");
break;
case 6:
printf("星期六\\n");
break;
case 7:
printf("星期日\\n");
break;
default:
printf("输入数字无效\\n");
}
return 0;
}
2.2 循环结构(重复执行代码)
2.2.1 for 循环(最常用,已知循环次数)
语法:
for(初始化表达式; 条件判断; 更新表达式)
{
循环体代码;
}
执行顺序:初始化 → 条件判断 → 循环体 → 更新 → 再次判断
打印1-100数字
#include <stdio.h>
int main()
{
int i;
for(i = 1; i <= 100; i++)
{
printf("%d ", i);
}
return 0;
}
2.2.2 while 循环(未知循环次数)
先判断,后执行,条件成立才循环
while(条件表达式)
{
循环体;
变量更新;
}
实战案例:1~10累加和
#include <stdio.h>
int main()
{
int i = 1;
int sum = 0;
while(i <= 10)
{
sum += i;
i++;
}
printf("1~10累加和:%d\\n", sum);
return 0;
}
2.2.3 do-while 循环
先执行一次循环体,再判断条件,至少执行一次
#include <stdio.h>
int main()
{
int i = 1;
do{
printf("执行循环\\n");
i++;
}while(i <= 3);
return 0;
}
2.3 循环跳转语句
-
break:跳出当前循环/switch,终止循环
-
continue:跳过本次循环,直接进入下一次循环
实战案例:跳过偶数,只打印奇数
#include <stdio.h>
int main()
{
int i;
for(i = 1; i <= 10; i++)
{
if(i % 2 == 0)
{
continue;
// 遇到偶数跳过
}
printf("%d ", i);
}
return 0;
}
三、数组(批量存储同类型数据)
3.1 数组概念
数组是相同数据类型的有序集合,连续开辟内存空间,专门用来批量存储一组相同类型的数据,避免定义大量重复变量。
3.2 一维数组
3.2.1 定义语法
// 完整定义 数据类型 数组名[数组长度];
// 初始化 数据类型 数组名[长度] = {值1,值2,值3…};
3.2.2 核心特点
数组下标从0开始(重点!)
内存空间连续
数组长度一旦定义,不可修改
未初始化的元素默认值为0
3.2.3 实战代码:数组遍历+最值查找
#include <stdio.h>
int main()
{
// 定义并初始化数组
int arr[5] = {12, 45, 8, 96, 23};
int max = arr[0]; int i;
// 遍历数组
printf("数组所有元素:");
for(i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
// 找最大值
if(arr[i] > max)
{
max = arr[i];
}
}
printf("\\n数组最大值:%d\\n", max);
return 0;
}
3.3 二维数组
二维数组可以理解为多行多列的表格,适合存储矩阵、表格数据
3.3.1 定义与初始化
int arr[2][3] = {{1,2,3},{4,5,6}};
3.3.2 实战遍历代码
#include <stdio.h>
int main()
{
int arr[2][3] = {{1,2,3},{4,5,6}};
// 双层循环遍历二维数组
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
printf("\\n");
}
return 0;
}
3.4 字符数组与字符串
C语言无专门字符串类型,通过字符数组存储字符串,字符串默认以 \\0 作为结束标志。
#include <stdio.h>
int main()
{
// 字符串初始化
char str1[] = "hello c";
char str2[10] = {'a','b','c','\\0'};
printf("字符串1:%s\\n", str1);
printf("字符串2:%s\\n", str2);
return 0;
}
四、函数(代码模块化、复用核心)
4.1 函数概念
函数是完成特定功能的代码块,核心作用:代码复用、简化结构、分层开发、便于维护。
C语言程序入口:main函数,一个程序有且仅有一个main函数。
4.2 函数三要素
-
返回值类型:函数执行完毕返回的数据类型
-
函数名:函数唯一标识
-
参数列表:函数需要接收的外部数据
4.3 函数语法结构
返回值类型 函数名(参数列表)
{
函数体代码;
return 返回值;
}
4.4 函数分类实战
4.4.1 无参无返回值函数
#include <stdio.h>
// 自定义函数
void printHello()
{
printf("Hello C语言函数!\\n");
}
int main()
{
printHello();
// 函数调用
return 0;
}
4.4.2 有参有返回值函数(最常用)
实战案例:实现两数求和
#include <stdio.h>
// 求和函数
int add(int a, int b)
{
int sum = a + b;
return sum; // 返回结果
}
int main()
{
int res = add(10, 20);
// 调用函数,接收返回值
printf("两数之和:%d\\n", res);
return 0;
}
4.5 函数声明与调用规则
如果自定义函数写在main函数下方,需要在main上方提前声明,否则编译器报错。
#include <stdio.h>
// 函数声明
int maxNum(int a, int b);
int main()
{
printf("最大值:%d\\n", maxNum(50, 90));
return 0;
}
// 函数定义
int maxNum(int a, int b)
{
return a > b ? a : b;
}
4.6 局部变量与全局变量
-
局部变量:定义在函数内部,仅当前函数有效,函数结束销毁
-
全局变量:定义在所有函数外部,整个程序所有函数均可使用,程序结束销毁
五、指针(C语言灵魂、核心难点精讲)
5.1 指针核心概念
指针就是地址,指针变量就是存储地址的变量。
计算机中每个变量、数组、函数都有独立的内存地址,指针专门用来操作内存地址。
5.2 两个核心符号
-
& 取地址符:获取变量的内存地址
-
* 解引用符:通过地址找到对应内存的值
5.3 指针变量定义与基础使用
语法:数据类型 *指针变量名;
#include <stdio.h>
int main()
{
int num = 100;
int *p = #
// p存储num的地址
printf("num的值:%d\\n", num);
printf("num的地址:%p\\n", &num);
printf("指针p存储的地址:%p\\n", p);
printf("通过指针取值:%d\\n", *p);
// 通过指针修改原变量值
*p = 200;
printf("修改后num的值:%d\\n", num);
return 0;
}
5.4 指针的核心作用
间接修改变量的值
减少数据拷贝,提升程序效率
操作数组、字符串
实现函数间数据双向传递
5.5 指针实现函数交换两个数(经典案例)
普通传参无法修改实参,指针传参可以修改外部变量
#include <stdio.h>
// 指针传参交换两个数
void swap(int *a, int *b)
{
int temp = *a; *a = *b; *b = temp;
}
int main()
{
int x = 10, y = 20;
printf("交换前:x=%d, y=%d\\n", x, y);
swap(&x, &y);
printf("交换后:x=%d, y=%d\\n", x, y);
return 0;
}
5.6 指针与数组
数组名本质是数组首元素的地址,可以通过指针遍历数组
#include <stdio.h>
int main()
{
int arr[3] = {11,22,33};
int *p = arr; // 数组名直接代表首地址
// 指针遍历数组
for(int i = 0; i < 3; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
5.7 新手指针易错点
-
指针变量必须初始化,不能使用野指针(未赋值的指针)
-
指针类型必须和指向的变量类型匹配
-
* 和 & 互为逆运算,不要混淆使用场景
六、阶段总结
本文完整覆盖C语言入门五大核心模块:
变量:数据存储基础,掌握类型、定义、作用域
流程控制:程序逻辑核心,分支+循环实现所有业务逻辑
数组:批量数据存储,一维、二维、字符数组全覆盖
函数:代码模块化,实现复用与分层思维
指针:C语言灵魂,地址操作、数据交互、数组底层原理
![打卡信奥刷题(3584)用C++实现信奥题 P11523 [THUPC 2025 初赛] 摊位分配-171主机测评](https://www.171host.com/wp-content/uploads/2026/09/20260922020544-6ab1e2783b78e-220x150.png)



