目录
前言
第01章_C语言入门
1.1初识计算机语言
1.2初识C语言
1.3第一个c程序
1.4IDE使用
1.5注释
1.6第一个c程序剖析
1.7printf()输出格式
第02章_变量与进制
2.1关键字
2.2标识符
2.3变量
2.4基本数据类型的使用
2.5变量间的运算规则
2.6常量
2.7输入/输出函数
2.8进制
第03章_运算符与流程控制
3.1运算符
3.2分支结构
3.3循环结构
3.4关键字break
3.5关键字continue
3.6关键字goto
第04章_数组
4.1数组的概述
4.2一维数组的使用
4.3一维数组的应用
4.4char数组与字符串
4.5二维数组的使用
第05章_指针
5.1指针的理解和定义
5.2指针的运算
5.3野指针
5.4多重指针
5.5指针与数组
第06章_函数
6.1函数的基本使用
6.2进一步认识函数
6.3参数传递机制
6.4函数的高级应用
6.5再谈变量
第07章_结构体与共用体
7.1结构体的基本使用
7.2进一步认识结构体
7.3结构体数组
7.4结构体指针
7.5结构体在数据结构中的应用
7.6共用体类型的使用
7.7typedef的使用
第08章_C语言常用函数
8.1字符串的表示
8.2字符串的常用函数
8.3字符串与基本数据类型的转化
8.4日期相关函数
8.5数学相关函数
8.6内存管理相关函数
第09章_文件操作
9.1文件和流
9.2c输入和输出
9.3c文件的读写
前言
根据b站视频课程编写的笔记
001.C语言课程介绍_哔哩哔哩_bilibili
第01章_C语言入门
1.1初识计算机语言
计算机编程语言
,就是人与计算机交流的方式。人们可以使用
编程语言
对计算机下达
命令
,让计算机完成人们需要的功能。
计算机语言有很多种。如:
C
、
C++
、
Java
、
Go
、
JavaScript
、
Python
,
Scala
等。
语言
=
语法
+
逻辑
1.2初识C语言
C
语言最初是作为
Unix
系统的开发工具而发明的。
1969
年,美国贝尔实验室的肯
·
汤普森(
Ken Thompson
)与丹尼斯
·
里奇(
Dennis Ritchie
)一起开发了
Unix
操作系统。
Unix
是用
汇编语
言
写的,依赖于计算机硬件。为了程序的
可读性
和
可移植性
,他
们决定使用高级语言重写。但是,当时的高级语言无法满足他们的
要求,汤普森就在
BCPL
语言的基础上发明了
B
语言
。
1972
年,丹尼斯
·
里奇(
Dennis Ritchie
)在
B
语言的基础上重新设计
了一种新语言,这种新语言取代了
B
语言,称为
C
语言
。
1973
年,
整个
Unix
系统都使用
C
语言重写
。
1.3第一个c程序
1.编写代码
#include <stdio.h>
int main()
{
printf("hello,world!!\n");
return 0;
}
2.安装编译器
目前,最常见的
C
语言编译器是自由软件基金会推出的
GCC
编译
器
,可以免费使用。
Linux
和
Mac
系统可以直接安装
GCC
,
Windows
系统可以安装
MinGW
。
补充知识:
MinGW
和
GCC
的区别:
GCC
是一个跨平台的编译器集合,可用于多种操作系统和处理器
架构,包括
Windows
;而
MinGW
是
GCC
在
Windows
平台上的移植版
本,主要用于在
Windows
上本地编译
C
和
C++
代码。
3.编译&运行
gcc Hello.c
a.exe
GCC
的
-o
参数(
output
的缩写)可以指定编译产物的文件名。
> gcc -o Hello Hello.c
GCC
的
-
std=
参数
(
standard
的缩写)还可以指定按照哪个
C
语
言的标准进行编译。
上面命令指定按照
C99
标准进行编译。
1.4IDE使用
我的使用的是vscode,配置教程如下
VSCode配置C语言环境(详细教程)_c语言vscode配置-CSDN博客
1.5注释
C
语言中的注释类型:
单行注释
//
单行注释
多行注释
(
或块注释
)
/*
这是第一行注释
这是第二行注释
这是第三行注释
*/
/*
我是被注释的文字
*/
1.6第一个c程序剖析
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
①
main()
int main(){}
每一个程序
(
或工程
)
可以定义很多函数
(
后面讲
)
,但有且只有一
个
main()
函数,作为程序执行的入口,在
main()
函数结尾结束整
个程序的运行。
空括号
()
,表示
main
不接受任何参数。
写在
main
之前的
“int”
称为关键字,代表数据类型是整型。它是
main()
的返回值类型。即在执行
main()
函数后会得到一个整型值
(
即函数值
)
。
C
语言约定:
return 0
,表示
main()
函数终止运行,且运行成
功;如果返回其它非零整数,就表示运行失败。默认情况下,如
果
main()
里面省略
return 0
这一行,编译器会自动加上,但
是为了保持统一的代码风格,不建议省略。
② 函数体
一对花括号
{}
定义了函数的主体,所有函数都必须以大括号开头
和结尾,成对出现。
C
程序中的函数体指的是作为该函数一部分的语句。它可以是任
何操作,比如搜索、排序、打印等。
每一个执行语句后面都会有一个英文分号
“;”
作为语句结束的标
志。
一行内可写几条语句,一条语句也可写在几行上。
③
printf()
printf()
函数是产生格式化输出的函数,作用是将参数文本输出到屏
幕。它名字里面的
f
代表
format (
格式化
)
,表示可以指定输出文本
的格式。
为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个
换行符
\n
。
printf
(
"Hello World"
);
//
将字符串输出到控制台,行尾不换行
printf("Hello World\n");
④ 标准库、头文件
printf()
是在标准库的头文件
stdio.h
中定义的。要想在程序中使
用这个函数,必须在源文件头部引入这个头文件。即:
#include <stdio.h>
何为标准库?
程序需要用到的功能,不一定需要自己编写,
C
语言可能已经自带
了。程序员只要去调用这些自带的功能就可以了。
C
语言自带的所
有这些功能,统称为
“
标准库
”(standard library)
,包含
C
内置函数、常量和头文件。
因为它们是写入标准的,到底包括哪些功能,应该怎么使用,都是
规定好的,我们直接调用即可。
何为头文件?
不同的功能定义在不同的文件里,这些文件统称为
“
头文件
”
(header file)
。如果系统自带某一个功能,就一定会自带描述
这个功能的头文件,比如
printf()
的头文件就是系统自带的
stdio.h
。头文件的后缀通常是
.h
。
预处理命令:
#include
命令
如果要使用某个功能,就必须先加载其对应的头文件,加载使用的
是
#include
命令,声明在各文件模块的开头。
C
语言中以
#
号开
头的命令称为
预处理命令
。顾名思义,在编译器对当前
C
程序进行
编译前执行预处理操作。
格式:
printf
(
"Hello World\n"
);
#include <stdio.h>
#include <
头文件名
>
举例:
#include <stdio.h>
注意,加载头文件的
#include
语句不需要分号结尾
对比写法:
#include <stdio.h>
:
//
编译系统在系统头文件所在目录搜索
#include "stdio.h"
:
//
编译系统首先在当前的源文件目录中查找
stdio.h
,找不到的话,再转向系统头文件所在目录搜索。
stdio.h
是系统提供的一个文件名,
stdio
是
standard input & output的缩写。
结论:
引用系统头文件,两种形式都会可以, #include <> 效率
高。
引用用户头文件,只能使用 #include "" 。
常用的
C
头文件
stdio.h
——
定义核心输入和输出函数
printf()
、
scanf()
、
getchar()
、
putchar()
stdlib.h
——
定义数值转换函数、伪随机网络生成器和内存分
配
string.h
——
定义字符串处理函数
stdint.h
——
定义精确宽度的整数类型
math.h
——
定义常用的数学函数
sin()
、
sqrt()
stddef.h
——
定义了几个有用的类型和宏
1.7printf()输出格式
printf(格式控制字符串,输出列表)
![](https://i-blog.csdnimg.cn/blog_migrate/6987d23ea50bbf1747c683a1a5c4b5c4.png)
其中,
"
格式控制字符串
"
是用双引号括起来的一个字符串。包括:
普通字符:普通字符即需要在输出时原样输出的字符。
占位符:由
“%”
和格式字符组成。这个位置可以用其它值代
入。
"
输出列表
"
是程序需要输出的一些数据,可以是常量、变量或
表达式。用于替换占位符的位置。
注意:printf() 参数与占位符是一一对应关系。如果参数个数少于
对应的占位符, printf() 可能会输出内存中的任意值。
占位符
占位符的第一个字符是
%
,第二个字符表示占位符的类型。
printf()
的占位符有许多种类,与
C
语言的数据类型相对应。
下面按照字母顺序,列出占位符如下,方便查阅
(
红色为常用的
)
:
%a :浮点数(仅C99有效)
%A :浮点数(仅C99有效)
%c :char型数据
%d :十进制整数(int)
%e :使用科学计数法的浮点数,指
数部分的 e 为小写
%E :使用科学计数法的浮点数,指数部分的
E 为大写
%i :整数,基本等同于 %d
%f :浮点数(float)
%g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科
学计数法,指数部分的 e 为小写
%G :等同于 %g ,唯一的区别是指数部分的 E 为大写
%hd :十进制 short int 类型
%ho :八进制 short int 类型
%hx :十六进制 short int 类型
%hu :unsigned short int 类型
%ld :十进制整数(long)
%lo :八进制 long int 类型
%lx :十六进制 long int 类型
%lu :unsigned long int 类型
%lld :十进制 long long int 类型
%llo :八进制 long long int 类型
%llx :十六进制 long long int 类型
%llu :unsigned long long int类型
%le :科学计数法表示的 long double 类型浮点数
%lf :十进制浮点数(double)
%n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中
%o :八进制整数
%p :指针
%s :字符串
%u :十进制无符号整数(unsigned int)
%x :十六进制整数 %zd : size_t 类型
%% :输出一个百分号
输出格式
printf()
可以定制占位符的输出格式。
格式
1
:限定宽度
printf()
允许限定占位符的最小宽度。
printf("%5d\n", 123); // 输出为 " 123"
说明:
%5d
表示这个占位符的宽度至少为
5
位。如果不满
5
位,对应
的值的前面会添加空格。
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成
左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入
一个 - 号。
printf("%-5d\n", 123); // 输出为 "123 "
对于小数,这个限定符会限制所有数字的最小显示宽度
printf("%12f\n", 123.45); // 输出 " 123.450000"
%12f
表示输出的浮点数最少要占据
12
位。由于小数的默认显示精度
是小数点后
6
位,所以
123.45
输出结果的头部会添加
2
个空格。
格式
2
:总是显示正负号
默认情况下,
printf()
不对正数显示
+
号,只对负数显示
-
号。如果
想让正数也输出
+
号,可以在占位符的
%
后面加一个
+
。
printf("%+d\n", 11); // 输出 +11
printf("%+d\n", -11); // 输出 -11
格式
3
:限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后
面只保留两位,占位符可以写成
%.2f
printf
(
"Number is %.2f\n"
,
0.8
);
//
输出
Number is 0.80
这种写法可以与限定宽度占位符,结合使用。
printf
(
"%6.2f\n"
,
0.8
);
//
输出为
" 0.80"
说明:
%6.2f
表示输出字符串最小宽度为
6
,小数位数为
2
。整体长度
不足
6
位时,右对齐显示。
最小宽度和小数位数这两个限定值,都可以用 * 代替,通过 printf()
的参数传入。
printf("%*.*f\n", 6, 2, 0.8);
//等同于
printf("%6.2f\n", 0.8)
第02章_变量与进制
2.1关键字
2.2标识符
2.3变量
2.4基本数据类型的使用
2.5变量间的运算规则
2.6常量
2.7输入/输出函数
2.8进制
第03章_运算符与流程控制
3.1运算符
3.2分支结构
3.3循环结构
3.4关键字break
3.5关键字continue
3.6关键字goto
第04章_数组
4.1数组的概述
4.2一维数组的使用
4.3一维数组的应用
4.4char数组与字符串
4.5二维数组的使用
第05章_指针
5.1指针的理解和定义
计算机中程序的运行都是在内存中进行的,变量也是在内存中分配
的空间,且不同类型的变量占用不同大小的空间。那如何访问内存
中变量存储的数据呢?有两种方式:
直接访问
和
间接访问
。直接
访问,直接使用变量名进行的访问,以前的程序中都是采用这种方
式。
int num1 = 10;
int num2 = 20;
int num3 = num1 + num2;
间接访问,通过指针来实现。下面看如何理解指针。
为了能够有效的访问到内存的每个单元
(
即一个字节
)
,就给内存单元
进行了编号,这些编号被称为该
内存单元的地址
。因为每个内存单
元都有地址,所以变量存储的数据也是有地址的。
通过地址能找到所需的变量单元,可以说,
地址指向该变量单元
,
将
地址形象化地称为
“
指针
”
。即:
变量
:命名的内存空间,用于存放各种类型的数据。
变量名
:变量名是给内存空间取的一个容易记忆的名字。
变量值
:在变量单元中存放的数据值。
变量的地址
:变量所使用的内存空间的地址,即
指针
。
![](https://i-blog.csdnimg.cn/blog_migrate/78e2e20f1315e491753f884ebf9e5d41.png)
上图中,地址0x00000001是变量 i 的指针,i_pointer就是一个指针变量。
体会:指针就是内存地址,使用指针访问变量,就是直接对内存地址中的数据进行操作。
指针变量的定义
一般格式:
数据类型 *指针变量名 [=初始地址值];
举例1:
int *p; //读作:指向int的指针”或简称“int指针”
这是一个指针变量,用于存储int型的整数在内存空间中数据的地址。
变形写法:
int* p;
int * p;
注意:
1、指针变量的名字是 p,不是*p。
2、指针变量中只能存放地址,不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。
举例2:同一行声明两个指针变量
// 正确
int * a, * b;
// 错误
int* a, b; //此时a是整数指针变量,而b是整数变量
举例3:一个指针指向的可能还是指针,这时就要用两个星号 ** 表示。(后面讲)
int **foo;
指针的应用场景
场景1:使用指针访问变量或数组的元素。
场景2:应用在数据结构中。比如:![](https://i-blog.csdnimg.cn/blog_migrate/f1c93f465f17389a0ebc94c290ce3e88.png)
5.2指针的运算
指针作为一种特殊的数据类型可以参与运算,但与其他数据类型不同的是,指针的运算都是针对内存中的地址来实现的。
取址运算符:&
取址运算符,使用“&
”符号来表示。作用:取出指定变量在内存中的地址
,其语法格式如下:
&变量
举例1:
int num = 10;
printf("num = %d\n", num); // 输出变量的值。 num = 10
printf("&num = %p\n", &num); // 输出变量的内存地址。&num = 00000050593ffbbc
说明:
1、在输出取址运算获得的地址时,需要使用“%p”作为格式输出符。
2、这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)。
举例2:将变量的地址赋值给指针变量
int num = 10;
int *p; //p为一个整型指针变量
p = #
![](https://i-blog.csdnimg.cn/blog_migrate/d0cdeb0f91227a1fc6d3bb89da4368da.png)
举例3:
int d = 10;
int *e, *f;
e = &d;
f = e;
指针变量的赋值
1、指针变量中只能存放地址(指针),不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。
2、C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,即它是“带类型的地址
”。所以,一个指针变量只能指向同一个类型的变量,不能抛开类型随意赋值。
-
char* 类型的指针是为了存放 char 类型变量的地址。
-
short* 类型的指针是为了存放 short 类型变量的地址。
-
int* 类型的指针是为了存放 int 类型变量的地址。
3、在没有对指针变量赋值时,指针变量的值是不确定的,可能系统会分配一个未知的地址,此时使用此指针变量可能会导致不可预料的后果甚至是系统崩溃。为了避免这个问题,通常给指针变量赋初始值为0(或NULL),并把值为0的指针变量称为空指针变量
。
举例4:通过指针变量修改指向的内存中的数据
int main() {
int num = 10, *ptr;
ptr = #
printf("%d\n",num);
scanf("%d", ptr); //等价于scanf("%d", &num);
printf("%d\n",num);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/7f800038f4ea5f34e75a0927f4719a2d.png)
5.3野指针
5.4多重指针
5.5指针与数组
第06章_函数
6.1函数的基本使用
6.2进一步认识函数
6.3参数传递机制
6.4函数的高级应用
6.5再谈变量
第07章_结构体与共用体
7.1结构体的基本使用
7.2进一步认识结构体
7.3结构体数组
7.4结构体指针
7.5结构体在数据结构中的应用
7.6共用体类型的使用
7.7typedef的使用
第08章_C语言常用函数
8.1字符串的表示
8.2字符串的常用函数
8.3字符串与基本数据类型的转化
8.4日期相关函数
8.5数学相关函数
8.6内存管理相关函数
第09章_文件操作
9.1文件和流
9.2c输入和输出
9.3c文件的读写