C语言入门教程(第1讲):最通俗的C语言常见概念详解与实战讲解

🌱 文章摘要

每一位程序员,都有一个**"printf hello world"** 的起点。

这篇文章带你重新认识C语言 ,从它的诞生故事到第一个程序的执行,再到字符串、注释与语句的逻辑

我们不死记语法,不堆概念,而是用通俗的语言带你理解C语言的底层思想。

读完这篇,你将能亲手写出第一个属于自己的C语言程序 ,并真正明白它为什么能运行

这是**《C语言入门教程》第一讲**------送给每一个认真想学C语言的你。


💬 导读

这篇文章是**《C语言入门教程》**系列的第一讲。

如果你之前对编程感到迷茫、不知道从哪开始,这篇就是你的起点。

我们不会用艰深的术语,而是通过一个个小例子,带你从零理解C语言的运行逻辑:
什么是编译、为什么要有main函数、printf是怎么工作的、字符串为什么要加\0

本系列将从基础语法讲到实际开发,帮你循序渐进、扎实入门。


📘 建议收藏本专栏 :后续章节会持续更新,

包括数据类型、控制语句、函数、指针、数组、文件操作等完整体系。

如果你能坚持学完,你会发现------
C语言不仅是工具,更是理解计算机世界的第一扇门。


目录

一、C语言是什么

二、C语言的历史与发展

三、编译器与VS2022环境介绍

[3.1 编译原理的直观理解](#3.1 编译原理的直观理解)

[3.2 VS2022安装与使用提示](#3.2 VS2022安装与使用提示)

四、VS项目与文件结构深入理解

五、第一个C语言程序

六、main函数详解

[6.1 main函数的完整结构](#6.1 main函数的完整结构)

[6.2 return 0 的意义](#6.2 return 0 的意义)

七、printf函数与库函数

[7.1 printf的核心思想](#7.1 printf的核心思想)

[7.2 常见的格式控制符](#7.2 常见的格式控制符)

[7.3 初学者常见错误](#7.3 初学者常见错误)

[7.4 printf的"内部机制"小知识](#7.4 printf的“内部机制”小知识)

八、C语言关键字

九、字符与ASCII编码

十、字符串与\0

十一、转义字符

十二、语句与语句分类

十三、注释的意义与写法

[13.1 两种写法](#13.1 两种写法)

[13.2 常见误区](#13.2 常见误区)

[13.3 写注释的技巧](#13.3 写注释的技巧)

十四、总结

十五、下一讲预告

[15.1 下一讲预告](#15.1 下一讲预告)

[15.2 提前准备建议](#15.2 提前准备建议)


一、C语言是什么

在学习C语言之前,我们先思考一个问题:
为什么要学习编程?

计算机本质上是一台**"听话的机器"** ,它不会自己思考,只能执行人类写下的**"指令"**。

C语言就是人类和计算机之间的一种沟通方式。

它不像中文那样有语气词、感叹句,而是有着严谨的语法、逻辑和结构。

我们用C语言写出的每一行代码,都会被编译器翻译成机器能理解的**"二进制指令"**,

最终被CPU执行。

C语言 的魅力在于它既贴近底层,又保持足够的通用性

它不像汇编那样复杂难写,也不像Python那样屏蔽细节。

学习C语言的过程,其实就是理解计算机思维的过程:

你不只是学会写代码,而是学会**"让计算机思考的方式"**。


二、C语言的历史与发展

C语言的出现,几乎改变了整个计算机世界。

在20世纪70年代初,贝尔实验室的Dennis Ritchie和Ken Thompson希望设计一门既能写系统,又能跨平台的语言。

他们在B语言的基础上改进出了C语言,并用它重写了Unix操作系统的内核。

这件事具有划时代的意义:

C语言成为第一门能用高级语法直接操控硬件的语言。

后来,C语言又成为C++、C#、Objective-C、Java等语言的基础语法来源。

甚至Python、Go、Rust、Lua等现代语言,它们的解释器或虚拟机大多仍是用C写的。

因此,C语言被誉为:

"现代计算机语言的祖师爷"。

掌握C语言,你就掌握了理解其他语言的钥匙。

不论将来是学算法、操作系统、嵌入式开发还是AI底层计算,C语言的思想都会一直伴随你。


三、编译器与VS2022环境介绍

3.1 编译原理的直观理解

当你在Visual Studio中写下一行 printf("Hello C");

实际上并不是直接被计算机执行的。

编译器要先做四件事

  1. 预处理(Preprocessing)

    #include#define 这些指令展开。

  2. 编译(Compilation)

    检查语法,把源代码翻译成汇编语言。

  3. 汇编(Assembly)

    把汇编语言转换成机器指令,生成 .obj 目标文件。

  4. 链接(Linking)

    把多个目标文件和库函数合并成 .exe 可执行程序。

例如:

cpp 复制代码
hello.c → hello.i → hello.s → hello.obj → hello.exe

这四步每一步都可能报错。

当你在VS里看到红色波浪线时,那是**"编译阶段"**在提醒你语法错误;

如果程序能编译但运行报错,多半是**"链接阶段"或"逻辑错误"**。

理解这一流程,对初学者特别重要。

因为C语言不像Python那样会直接提示问题位置,

只有你理解**"编译器在干什么**",调试才会越来越顺手。


3.2 VS2022安装与使用提示

  • Visual Studio是微软出品的功能最全的C/C++ IDE。
  • 推荐版本:Visual Studio 2022 社区版(Community Edition)
  • 它完全免费,适合学习和个人开发使用。

安装建议:

  1. 打开微软官网下载页面,选择"使用C++的桌面开发"。
  2. 安装后第一次打开时,选择"C++开发"环境即可。
  3. 点击"创建新项目 → 控制台应用(Console App)"。
  4. 语言选择C++也没关系,后缀改为 .c 就能作为C文件运行。
    调试技巧:
  • Ctrl + F5 直接运行,不自动关闭窗口。
  • F5 启动调试模式,可逐行执行代码。
  • 设置断点后按 F10 可单步执行,用来观察变量值变化。

掌握这些基础操作后,你的学习体验会流畅很多。


四、VS项目与文件结构深入理解

很多初学者第一次使用VS时会被一堆文件夹吓到。

其实可以这样理解:

  • "解决方案"(Solution)是整个工程的大容器。
  • "项目"(Project)是你的程序。
  • 每个项目里可以有多个 .c 文件和 .h 文件。
  • .c 文件 中放的是代码逻辑,比如函数定义。
  • .h 文件 中放的是声明,比如函数原型、宏、常量定义。

举个例子:

假设我们要写一个计算器程序,可以有这样的结构:

cpp 复制代码
calculator/
├── main.c        // 程序入口
├── add.c         // 加法函数
├── sub.c         // 减法函数
├── calc.h        // 函数声明

main.c 中包含头文件:

cpp 复制代码
#include "calc.h"

这样编译器就能在链接阶段正确地把所有函数拼装起来。

这就是C语言项目模块化的思想------
不同功能分文件编写,最终由编译器整合。


五、第一个C语言程序

cpp 复制代码
#include <stdio.h>

int main()
{
    printf("hello C\n");
    return 0;
}

这个程序虽然只有三行,但蕴含了整个C语言的执行流程。

  • 编译阶段:

编译器读取 stdio.h 文件(标准输入输出库),找到 printf 函数的声明。

  • 链接阶段:

系统把 printf 的实现(存放在库文件里)链接到你的程序中。

  • 执行阶段:

操作系统把程序加载进内存,从 main() 开始执行。当 return 0; 语句执行完毕,程序结束并向系统返回0,表示"正常退出"。

一个重要的思维转变:

当你写下 printf("Hello C"); 时,你不是在**"输出文字"** ,而是在告诉计算机:"从显存缓冲区输出一个字符流到终端"
这就是编程思维与日常思维的区别。


六、main函数详解

每一个C语言程序都有且仅有一个 main() 函数

这不是一个普通的函数,它是程序的入口

换句话说:当你双击 .exe 文件时,操作系统首先会把控制权交给**main()**。

可以这么理解:

main 就像电影的开场镜头,
所有的剧情(代码)都会从这里开始播放。

6.1 main函数的完整结构

cpp 复制代码
#include <stdio.h>

int main(void)
{
    printf("程序开始执行!\n");
    return 0;
}
  • int:表示返回类型是整数。
  • main:函数名,固定写法。
  • ():括号内可以有参数(后续讲到命令行参数)。
  • {}:表示函数体。

6.2 return 0 的意义

有的初学者会写成这样:

cpp 复制代码
int main()
{
    printf("Hello\n");
}

虽然能运行,但少了 return 0;

这其实相当于默认返回0,但规范写法应明确返回值。

在大型工程中,return 0; 还能帮助系统或脚本判断程序是否运行成功。

推荐记忆法:

main负责起点,return负责终点。


七、printf函数与库函数

7.1 printf的核心思想

printf() 是输出函数,但更准确地说,它是一个格式化输出函数

它可以根据占位符,把不同类型的数据"拼接"成一个字符串,再输出到屏幕上。

举个例子:

cpp 复制代码
int age = 18;
printf("我今年%d岁。\n", age);

输出:

cpp 复制代码
我今年18岁。

printf 通过 %d 识别 int 类型,并把 age 的值替换进去。


7.2 常见的格式控制符

控制符 类型说明 示例
%d 输出整型 42
%c 输出字符 A
%f 输出浮点数 3.14
%lf 双精度浮点数 3.141593
%s 字符串 Hello
%x / %X 十六进制 0xFF
%p 输出地址(指针) 0x7ff...

举例:

cpp 复制代码
#include <stdio.h>

int main()
{
    int n = 255;
    printf("十进制:%d\n", n);
    printf("十六进制:%x\n", n);
    printf("地址:%p\n", &n);
    return 0;
}

输出:

cpp 复制代码
十进制:255
十六进制:ff
地址:0x000000dff...

7.3 初学者常见错误

错误示例1:

cpp 复制代码
printf("number = %d");

输出结果:number = (随机数字)

因为你忘了在格式控制符后面加变量。

正确写法:

cpp 复制代码
printf("number = %d", n);

错误示例2:

cpp 复制代码
printf("%d %d", a);

输出乱码 ,因为 %d 有两个,占位不匹配。

正确写法:

cpp 复制代码
printf("%d %d", a, b);

这些错误在调试时极其常见。

技巧: 每个 % 后面都要数清楚变量个数!


7.4 printf的"内部机制"小知识

printf 其实是通过缓冲区输出机制工作的。

当你调用 printf() 时,字符串先被放入输出缓冲区,等遇到换行符 \n 或程序结束时才真正显示出来。

所以,如果程序卡在 printf 前后,可以试试在输出语句后面加一个 \n


八、C语言关键字

C语言关键字共有32个,它们是语言定义的一部分,不可自定义重名。

建议记忆方法:"三行口诀法"

cpp 复制代码
数据类型有五种:int char float double void  
流程控制分三类:if for while switch case  
程序结构靠关键:return break continue typedef struct

小知识:

关键字在编译阶段被识别成特定**"操作指令"** ,而不是普通字符串。

这就是为什么写 Int main()(首字母大写)会报错------

C语言是大小写敏感的!


九、字符与ASCII编码

计算机底层只懂数字。

当你输入 A 时,计算机会把它转成 65

这就是ASCII码

你可以自己验证:

cpp 复制代码
#include <stdio.h>

int main()
{
    char ch = 'A';
    printf("字符:%c\n", ch);
    printf("ASCII码:%d\n", ch);
    return 0;
}

输出:

cpp 复制代码
字符:A ASCII码:65

同样地,数字也能反向转成字符:

cpp 复制代码
printf("%c\n", 97);

输出:

cpp 复制代码
a

这说明字符和整数本质上是可以互转的。

扩展知识

ASCII共有128个字符,分为三类:

  1. 控制字符(0--31)如换行\n、回车\r
  2. 数字与符号(32--64)
  3. 字母区间(65--122)

十、字符串与\0

字符串是由多个字符组成的一维数组,以 \0 结尾。

例如:

cpp 复制代码
char str[] = "Hello";

实际上在内存中存储的是:

cpp 复制代码
'H'  'e'  'l'  'l'  'o'  '\0'

所以字符串的长度比字符个数多1。

对比实验:

cpp 复制代码
#include <stdio.h>

int main()
{
    char arr1[] = {'H','e','l','l','o'};
    char arr2[] = "Hello";

    printf("arr1输出:%s\n", arr1);
    printf("arr2输出:%s\n", arr2);
    return 0;
}

输出:

cpp 复制代码
arr1输出:Hello?@Z乱字符
arr2输出:Hello

为什么?

因为 arr1 没有 \0,printf会一直向后读取,直到遇到随机的内存结束符。

经验总结:

使用双引号创建字符串,一定包含 \0

使用单字符数组时,要手动加上。

正确写法:

cpp 复制代码
char arr1[] = {'H','e','l','l','o','\0'};

十一、转义字符

转义字符让字符串能表示不可见符号。
\n 表示换行,\t 表示制表符(相当于按下 Tab 键)。

cpp 复制代码
#include <stdio.h>

int main()
{
    printf("行1\n行2\n");
    printf("列1\t列2\t列3\n");
    printf("路径: c:\\project\\main.c\n");
    return 0;
}

输出:

cpp 复制代码
行1
行2
列1    列2    列3
路径: c:\project\main.c

易错提醒:

  • 不要写成 "c:\test\new",因为 \n 会被当成换行。
  • 应写 "c:\\test\\new"

十二、语句与语句分类

在C语言中,语句是构成程序的最小单位。

每个语句必须以分号 ; 结束。

例如:

cpp 复制代码
int a = 10;  // 声明语句
a++;         // 表达式语句
printf("%d", a);  // 函数调用语句

如果忘了分号,编译器会报:

cpp 复制代码
error: expected ';' before 'return'

语句五分类复习:

  1. 空语句:只有一个分号,什么也不做;
  2. 表达式语句:完成计算或赋值;
  3. 函数调用语句:执行函数;
  4. 复合语句 :由 {} 包裹的多个语句;
  5. 控制语句 :如 ifwhilefor 等(后续讲)。

十三、注释的意义与写法

注释是程序员之间的"沟通语言"。

它不会被编译器执行,却是编写规范的重要组成部分。

13.1 两种写法

cpp 复制代码
// 单行注释
/* 多行
   注释 */

13.2 常见误区

错误示例:

cpp 复制代码
/* printf("错误!"); // 缺少 */

这会导致整个文件的剩余部分都被当成注释,编译失败。

正确写法:

cpp 复制代码
/* 这是注释 */
printf("正常输出\n");

13.3 写注释的技巧

  1. 关键逻辑前要写"为什么",而不是"做什么";
  2. 注释应与代码保持同步;
  3. 一行代码 + 一行注释,比十行无注释的代码更易维护。

优秀程序员写代码是给人看的,给计算机执行只是顺带!


十四、总结

这一讲,我们完成了C语言的**"第一次见面"** 。

你已经了解了:

  1. 计算机语言的本质
  2. C语言的历史与作用
  3. 从源代码到可执行程序的全过程
  4. 第一个程序的编译与运行
  5. printf、字符串、注释、语句的基础用法

到这里,你已经能独立写出第一个能运行的C语言程序

这不是一个小成就------它意味着你已经真正进入了编程世界

而下一步,我们将要学习如何"操作数据"


十五、下一讲预告

15.1 下一讲预告

C语言入门教程(第2讲):数据类型与变量详解与实战讲解-CSDN博客

在编程世界中,数据就是一切的起点。

这一讲,我们将深入探索C语言中最核心的部分------变量与数据类型 ,让你的程序真正**"有记忆、有逻辑"**。

主要内容包括:

  1. C语言中的各种数据类型(整型、浮点型、字符型、布尔型)
  2. sizeof 运算符与数据类型长度测试
  3. 有符号与无符号(signed / unsigned)的区别与陷阱
  4. 变量的创建与分类(全局变量 vs 局部变量)
  5. 算术、赋值、单目操作符的应用与易错点
  6. 强制类型转换的正确用法
  7. scanfprintf 的输入输出实战

通过下一讲 的学习,你将能熟练使用变量存储数据、实现计算、完成用户交互 ,为后续的"分支与循环控制"打下坚实基础。


15.2 提前准备建议

建议提前在VS2022中创建一个新项目,

并尝试使用**printf("%d", sizeof(int));** 测试各种类型的长度。

这样在阅读第 2 讲 时,你会更容易理解内存与数据的关系。


❤️系列更新提示

本文属于**《C语言入门教程》** 系列专栏第 1 讲

下一讲将带你正式进入C语言的**"数据世界"**
点赞 + 收藏 + 关注专栏,别错过更新

你的支持,是我持续更新的最大动力 💪

相关推荐
板鸭〈小号〉2 小时前
Socket网络编程(1)——Echo Server
开发语言·网络·php
爱上妖精的尾巴2 小时前
5-20 WPS JS宏 every与some数组的[与或]迭代(数组的逻辑判断)
开发语言·前端·javascript·wps·js宏·jsa
Larry_Yanan2 小时前
QML学习笔记(二十四)QML的Keys附加属性
c++·笔记·qt·学习·ui
gopher95112 小时前
Go 语言的 panic 和 recover
开发语言·golang
豆沙沙包?2 小时前
2025年--Lc165--H637.二叉树的层平均值(二叉树的层序遍历)--Java版
java·开发语言
迎風吹頭髮3 小时前
UNIX下C语言编程与实践40-UNIX 全局跳转:setjmp 与 longjmp 函数的使用与注意事项
java·c语言·unix
小蒜学长3 小时前
springboot二手儿童绘本交易系统设计与实现(代码+数据库+LW)
java·开发语言·spring boot·后端
李小白663 小时前
Python文件操作
开发语言·python
龙木之森3 小时前
纯 C++ 开发的 Telegram Bot 框架
c++·tui·telegram·bot