feat: add lab2

feat: add lab2 solution
feat: add week2 note
feat: add week2 lec
Co-authored-by: MayGe <152044636+M4yGem1ni@users.noreply.github.com>
Co-authored-by: EQ1932 <145545663+EQ1932@users.noreply.github.com>
This commit is contained in:
focused_xy 2024-10-14 14:13:09 +08:00
parent 12a865ea41
commit 3212dce9fe
55 changed files with 952 additions and 539 deletions

Binary file not shown.

BIN
Labs/lab2/Lab2.tar.gz Normal file

Binary file not shown.

111
Labs/lab2/lab2.md Normal file
View File

@ -0,0 +1,111 @@
# Lab2 C 语言基本语法
## Lab2_1 C 语言基本语法
- 完成lab2_1中的四个.c文件
- 请根据每个ex_中的TODO完成内容。
- 你可以使用 make 自动编译可执行文件
```bash
make # 编译所有可执行文件
make ex1_ptr # 仅编译 ex1_ptr.c
./ex1_ptr # 运行 ex1_ptr
make clean # 删除可执行文件
```
## Lab2_2 字符串和循环
- 本实验使用了参数char *argv[],请在编译后尝试向程序输入命令行参数,如:
```bash
make
./str_and_cyc California Oregon Washington Texas
```
输出内容,如下所示:
```bash
for:
arg 1: California
arg 2: Oregon
arg 3: Washington
arg 4: Texas
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
while:
arg 0: ./str_and_cyc
arg 1: California
arg 2: Oregon
arg 3: Washington
arg 4: Texas
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
```
- 请对srt_and_cyc.c文件中的for和while循环尝试以下操作并查看结果。
- for循环
- 将i初始化为0看看会发生什么。是否也需要改动argc不改动的话它能正常工作吗为什么下标从0开始可以正常工作
- 将num_states改为错误的值(使它变大),来看看会发生什么。
- RTFM: NULL是什么东西尝试将它用做states的一个元素看看它会打印出什么。
- 看看你是否能在打印之前将states的一个元素赋值给argv中的元素再试试相反的操作。
- while循环
- 使用while循环将argv中的值复制到states。
- 让这个复制循环不会执行失败即使argv之中有很多元素也不会全部放进states。
- 研究你是否真正复制了这些字符串。答案可能会让你感到意外和困惑。
## 递归(可选,难度较大)
- 经典递归例子
```C
#include <stdio.h>
int fibonacci(int n) {
if (n < 1) {
return -1;
}
if (n == 1 || n == 2) {
return 1;
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
int main(void)
{
int a;
while (scanf("%d", &a) != EOF) {
printf("Fibonacci数列第%d项为:%d\n", a, fibonacci(a));
}
return 0;
}
```
- 理解递归的重要方式
- Base Case递归主体以一个基本情况开始通常它是这个条件语句定义了函数对最简单的输入的行为并通常被用作递归结束的出口。
- Recursive Calls在Base Case之后是一个或多个递归调用。递归调用总是有一个特点它们简化了原来的问题。
- 数学归纳法理解:
1. 验证递归函数`F(X)`取Base Case时成立.
2. 假设X = n时成立那么可以推导出在X = n+1时递归函数`F(X)`做出正确的行为。
3. 最后一步总结表述。
- 数独
- 数独Sudoku是一种经典的逻辑数字游戏通常由一个9x9的网格组成这个网格被进一步划分为9个3x3的小方块。游戏的目标是通过填充数字1到9使得每一行、每一列和每一个3x3的小方块都包含数字1到9且数字不能重复。
- 实现一个递归函数`bool solveSudoku(int board[N][N], int row, int col)`判断数独是否可解,有解则填充正确答案。
- 题中数独采用二维数组需解答填充的数字用0代替如
0 6 0 0 0 0 0 7 1
7 0 5 4 0 3 0 0 0
0 0 0 6 7 0 3 0 0
0 3 7 2 4 1 8 6 0
0 0 0 0 0 5 1 9 0
1 5 8 7 9 0 2 3 0
6 0 1 0 2 0 0 0 3
0 7 9 0 0 0 5 0 2
0 0 0 0 0 4 7 0 0
提供了`printBoard(int board[N][N])`函数打印数独和`isSafe(int board[N][N], int row, int col, int num)`函数检查数字是否可以放在board[row][col]位置。
- 运行judge.sh检测程序正确性。
- 完成文件`sudoku.c`中的`solveSudoku`函数编写。

View File

@ -1,5 +1,5 @@
CC := gcc
CFLAGS := -Wall -Werror -Wpedantic -g -std=c11
CFLAGS := -Wall -Wextra -Werror -g -std=c11
TARGET := float hello-world
all: $(TARGET)

View File

@ -0,0 +1,70 @@
/* C 语言中的控制流 */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
// 条件分支
// if else
if (argc == 1) {
printf("args = NULL\n");
} else if (argc == 2) {
printf("args = %d\n", argc - 1);
printf("argv:%s\n", argv[1]);
} else {
printf("args = %d\n", argc - 1);
}
printf("\n");
// switch
switch (argc) {
case 1:
printf("args = NULL\n");
break;
case 2:
printf("args = %d\n", argc - 1);
printf("argv:%s\n", argv[1]);
break;
default:
printf("args = %d\n", argc - 1);
break;
}
// 三元表达式
argc == 2 ? printf("yes\n\n") : printf("no\n\n");
// 循环结构
int i = 10;
while (i != 0) {
printf("%d ", i);
i--;
}
printf("\n");
do {
printf("%d ", i);
i++;
} while (i < 10);
printf("\n");
for (i = 0; i < 10; i++) {
printf("%d ", i);
}
printf("\n\n");
// 跳转控制语句
/**
* @statement break; switch语句
* @statement continue;
*/
printf("goto语句示范:\n");
int go = 0;
lable:
printf("%d ", go);
if (go < 3) {
go++;
goto lable;
}
printf("\n");
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,22 @@
#include <stdio.h>
#include <stdlib.h>
// 函数声明
int fact(int);
int main(void) {
printf("%d", fact(5));
return EXIT_SUCCESS;
}
// 函数定义
int fact(int n) {
if (n <= 1) {
return 1;
}
int sum = 1, i;
for (i = 1; i <= n; i++) {
sum *= i;
}
return sum;
}

View File

@ -0,0 +1,20 @@
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// 定义
unsigned char temp[10] = {0x11, 0x15, 0x22};
// 数组的地址
printf("temp address: %p\n", temp);
// 更改
temp[3] = 0xa8;
// 使用
for (size_t i = 0; i < 10; i++) {
printf("%02x ", temp[i]);
}
printf("\n");
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 字符串以'\0'结尾 */
int main(void) {
char str1[] = "I Can Eat Glass";
char str2[20] = "I Can Eat Glass";
printf("str1:%s\nsize:%lu\nstr2:%s\nsize:%lu\n", str1, strlen(str1), str2,
strlen(str2));
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,31 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* string.h标准库的几个常用函数 */
int main(void) {
char str1[] = "I Can Eat Glass";
char str2[] = "Neko Bytes";
printf("str1:%s\nsize:%lu\nstr2:%s\nsize:%lu\n", str1, strlen(str1), str2,
strlen(str2));
// 字符串比较
int h = strcmp(str1, str2);
if (h != 0) {
if (h > 0) {
printf("str1更大\n");
} else {
printf("str2更大\n");
}
} else {
printf("str1和str2一样大\n");
}
// 字符串赋值
strcpy(str1, "I love windows\n");
printf("str1:%s", str1);
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,9 @@
#include <stdio.h>
#define MAX 1000
int main(void) {
printf("MAX: %d", MAX);
return 0;
}

View File

@ -0,0 +1,13 @@
#include <stdio.h>
int main(void) {
unsigned int a;
int b;
float c;
printf("a,b,c各元素的值\n");
printf("%u %d %f\n", a, b, c);
printf("a,b,c各元素的地址\n");
printf("%p %p %p\n", &a, &b, &c);
return 0;
}

View File

@ -0,0 +1,11 @@
#include <stdio.h>
int main(void) {
int matrix[2][2] = {{1, 2}, {3, 4}};
printf("%p %p %p %p\n", &matrix[0][0], &matrix[0][1], &matrix[1][0],
&matrix[1][1]);
printf("sizeof matrix: %zu\n", sizeof matrix);
printf("sizeof matrix[0]: %zu\n", sizeof matrix[0]);
printf("sizeof matrix[1]: %zu\n", sizeof matrix[1]);
return 0;
}

View File

@ -0,0 +1,23 @@
#include <stdio.h>
void swap1(int x, int y) {
int t = x;
x = y;
y = t;
}
void swap2(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
int main(void) {
int a = 1, b = 2;
printf("a = %d, b = %d\n", a, b);
swap1(a, b);
printf("a = %d, b = %d after swap1\n", a, b);
swap2(&a, &b);
printf("a = %d, b = %d after swap2\n", a, b);
return 0;
}

View File

@ -0,0 +1,14 @@
#include <stdio.h>
int main(void) {
int array[10] = {0};
printf("array = %p\n", array);
int *p1 = array, *p2 = array;
printf("p1 = %p, p2 = %p\n", p1, p2);
p1 = p1 + 1;
printf("p1 = %p, p2 = %p\n", p1, p2);
p2 = p2 + 9;
printf("p1 = %p, p2 = %p\n", p1, p2);
printf("p2 - p1 = %u\n", (unsigned int)(p2 - p1));
return 0;
}

View File

@ -0,0 +1,7 @@
在本目录下打开终端,输入:
```bash
make
```
在`./build`目录下生成对应的可执行文件

View File

@ -0,0 +1,17 @@
BUILD_DIR = ./build
CC := gcc
CFLAGS := -Wall -Wextra -g -std=c11
SRCS := $(wildcard *.c)
TARGETS := $(SRCS:%.c=$(BUILD_DIR)/%)
all: $(TARGETS)
$(BUILD_DIR)/%: %.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -o $@ $<
clean:
-rm -rf $(BUILD_DIR)
.PHONY: clean all

View File

@ -12,7 +12,7 @@
type="text/css">
<title> Lecture3 </title>
<!-- browser favicon -->
<link rel="shortcut icon" href="./static/img/favicon.ico">
<link rel="shortcut icon" href="./static/img/favicon.png">
<style>
.font-sans {
font-family: 'Lato', 'SimHei', 'STHeiti', 'SimHei', 'Serif';
@ -22,9 +22,15 @@
font-family: 'Source Serif Pro', 'Songti SC', 'SimSun', 'Serif', serif;
}
</style>
<!-- <link rel="stylesheet" href="https://jyywiki.cn/static/katex/katex.min.css">
<script defer src="https://jyywiki.cn/static/katex/katex.min.js"></script> -->
<link rel="stylesheet" href="./static/katex/katex.min.css">
<script defer src="./static/katex/katex.min.js"></script>
<!-- <script defer src="https://jyywiki.cn/static/katex/auto-render.min.js"
integrity="sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05"
crossorigin="anonymous"></script> -->
<script defer src="./static/katex/auto-render.min.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
renderMathInElement(document.body, {
@ -52,67 +58,114 @@
<div class="reveal">
<div class="slides">
<section><section><div class="center middle"><div style="width:100%"><div><h1 id="c" class="text-2xl mt-2 font-sans">C 语言基础语法</h1><p class="font-serif my-1">
<include src="Slides_Author">
<div class="py-16">
<p class="font-serif my-1">
<a href="https://github.com/M4yGem1ni" class=" text-amber-900">
M4yGem1ni
</a>
</p>
</div>
<div class="row">
<p class="font-serif my-1"/>
<section>
<section>
<div class="center middle">
<div style="width:100%">
<div>
<h1 id="c" class="text-2xl mt-2 font-sans">C 语言基础语法</h1>
<p class="font-serif my-1">
<include src="Slides_Author">
<div class="py-16">
<p class="font-serif my-1">
<a href="https://github.com/M4yGem1ni" class=" text-amber-900">
M4yGem1ni
</a>
</p>
</div>
<div class="row">
<p class="font-serif my-1" />
<div class="author-affiliation">
<a href="https://github.com/E1PsyCongroo/NekoBytes-TheMissing" class=" text-amber-900">
<p class="font-serif my-1">
NekoBytes
</p>
<img class="inline-img h-24" src="./static/img/66763c573c4c496bb6f09e2846e59de6.svg" style="display: inline-block;"/>
</a>
</div>
<div class="author-affiliation">
<a href="https://github.com/E1PsyCongroo/NekoBytes-TheMissing"
class=" text-amber-900">
<p class="font-serif my-1">
NekoBytes
</p>
<img class="inline-img h-24"
src="./static/img/505d39ab3d4a4f969b90552a6c5477cc.svg"
style="display: inline-block;" />
</a>
</div>
</div>
</include>
</p></div></div></div></section></section><section><section><div><h2 id="agenda-part-1" class="text-xl mt-2 pb-2 font-sans">Agenda Part 1</h2>
<p class="font-serif my-1"><img class="float-right" src="./static/img/63614731af7e4930ac3b8f45cc6b2e44.png" width=""/></p>
<ul class="list-disc font-serif">
<li class="ml-8">计算机科学抽象思维</li>
<li class="ml-8">C语言常量</li>
<li class="ml-8">C中的控制流</li>
<li class="ml-8">函数</li>
<li class="ml-8">数组</li>
<li class="ml-8">字符串</li>
<li class="ml-8">宏定义与预处理</li>
</ul></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">抽象是什么?能吃吗</h2>
<ul class="list-disc font-serif">
<li class="ml-8">抽象好比是一个黑箱,我们不需要知道中间发生的过程,只需要知道我输入了什么,我能输出什么,最简单的例子就是 <code>printf</code></li>
</ul>
<p class="font-serif my-1"><img class="float-center" src="./static/img/05b06177e02440f4957a387c50507e20.png" width=""/>
<img class="float-center" src="./static/img/8a29491886574f1cb6af2da1f77bb829.png" width=""/>
<img class="float-center" src="./static/img/60381f9c9e444d2cacd7458c6babd353.png" width=""/></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">编程本身就是一种抽象</h2>
<ul class="list-disc font-serif">
<li class="ml-8">我们使用的编程语言比如C语言和Python都是抽象因为计算机只懂二进制。</li>
</ul>
<p class="font-serif my-1"><img alt="抽象" src="./static/img/8fd69852d3f14e008b126f72aae93328.png"/>
</p><center>
<img class="inline" src="./static/img/45025d0dd00b40458caeef05daef1884.png" width="45%"/>
<img class="inline" src="./static/img/80a5b2eae1c046d3ae60ea5547588073.png" width="45%"/>
</center></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">抽象的力量</h2>
<p class="font-serif my-1"><a href="https://www.2048.org">https://www.2048.org</a>
这是一个2048
我们可以将其分解为以下几个模块</p>
<ul class="list-disc font-serif">
<li class="ml-8">游戏板: board[BOARD_SIZE][BOARD_SZIE]</li>
<li class="ml-8">初始化: initialize_board</li>
<li class="ml-8">随机生成: generator_number</li>
<li class="ml-8">打印显示: print_board</li>
<li class="ml-8">读取移动指令: choose_direction</li>
<li class="ml-8">合并并移动: move_and_merge</li>
<li class="ml-8">判断游戏终止: is_finished</li>
</ul></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">抽象的力量</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="n">run_game</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
</div>
</include>
</p>
</div>
</div>
</div>
</section>
</section>
<section>
<section>
<div>
<h2 id="agenda-part-1" class="text-xl mt-2 pb-2 font-sans">Agenda Part 1</h2>
<p class="font-serif my-1"><img class="float-right"
src="./static/img/f7640ea9a80d4963bfe259c5f15245f6.png" width="" /></p>
<ul class="list-disc font-serif">
<li class="ml-8">计算机科学抽象思维</li>
<li class="ml-8">C语言常量</li>
<li class="ml-8">C中的控制流</li>
<li class="ml-8">函数</li>
<li class="ml-8">数组</li>
<li class="ml-8">字符串</li>
<li class="ml-8">宏定义与预处理</li>
</ul>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">抽象是什么?能吃吗</h2>
<ul class="list-disc font-serif">
<li class="ml-8">抽象好比是一个黑箱,我们不需要知道中间发生的过程,只需要知道我输入了什么,我能输出什么,最简单的例子就是 <code>printf</code>
</li>
</ul>
<p class="font-serif my-1"><img class="float-center"
src="./static/img/eb0c14e67ede4c6982f672d1f23f8347.png" width="" />
<img class="float-center" src="./static/img/04c55e39a9fa4c7aa2edca121fb4bc52.png"
width="" />
<img class="float-center" src="./static/img/16a82e9965414299a076175865f6bea8.png"
width="" />
</p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">编程本身就是一种抽象</h2>
<ul class="list-disc font-serif">
<li class="ml-8">我们使用的编程语言比如C语言和Python都是抽象因为计算机只懂二进制。</li>
</ul>
<p class="font-serif my-1"><img alt="抽象"
src="./static/img/d48aeab415ac4fdea9b473afe3e429b7.png" />
</p>
<center>
<img class="inline" src="./static/img/baf1ff76a5814d75bf99e5b2725d95e3.png" width="45%" />
<img class="inline" src="./static/img/9697bafbcaf14e97872e3fe646a5af93.png" width="45%" />
</center>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">抽象的力量</h2>
<p class="font-serif my-1"><a href="https://www.2048.org">https://www.2048.org</a>
这是一个2048
我们可以将其分解为以下几个模块</p>
<ul class="list-disc font-serif">
<li class="ml-8">游戏板: board[BOARD_SIZE][BOARD_SZIE]</li>
<li class="ml-8">初始化: initialize_board</li>
<li class="ml-8">随机生成: generator_number</li>
<li class="ml-8">打印显示: print_board</li>
<li class="ml-8">读取移动指令: choose_direction</li>
<li class="ml-8">合并并移动: move_and_merge</li>
<li class="ml-8">判断游戏终止: is_finished</li>
</ul>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">抽象的力量</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="n">run_game</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">initialize_board</span><span class="p">();</span>
<span class="w"> </span><span class="n">generator_number</span><span class="p">();</span><span class="w"> </span><span class="n">generator_number</span><span class="p">();</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nb">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
@ -127,55 +180,73 @@
<span class="w"> </span><span class="n">print_board</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">变量</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="k">typedef</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="kt">uint8_t</span><span class="p">;</span>
</code></pre></div>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">变量</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="k">typedef</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="kt">uint8_t</span><span class="p">;</span>
</code></pre>
</div>
<table>
<thead>
<tr>
<th>类型</th>
<th>描述</th>
<th>例子</th>
</tr>
</thead>
<tbody>
<tr>
<td>char</td>
<td>8位ASCII</td>
<td>a, A, \n, 12</td>
</tr>
<tr>
<td>int</td>
<td>整数值正、负、0&gt;= 16 位一般为32位</td>
<td>0, 78, -217, 0x2E</td>
</tr>
<tr>
<td>unsigned int</td>
<td>整数值正、0</td>
<td>0, 6, 35102</td>
</tr>
<tr>
<td>short</td>
<td>整数值正、负、0&gt;= 16 位一般为16位</td>
<td>0, -8, 32767</td>
</tr>
<tr>
<td>long</td>
<td>整数值正、负、0&gt;= 32 位一般为32位</td>
<td>0, 78, -217, 301713123194</td>
</tr>
</tbody>
</table></div></section><section><div><h2 id="const" class="text-xl mt-2 pb-2 font-sans">Const 常量</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">integer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span>
<table>
<thead>
<tr>
<th>类型</th>
<th>描述</th>
<th>例子</th>
</tr>
</thead>
<tbody>
<tr>
<td>char</td>
<td>8位ASCII</td>
<td>a, A, \n, 12</td>
</tr>
<tr>
<td>int</td>
<td>整数值正、负、0&gt;= 16 位一般为32位</td>
<td>0, 78, -217, 0x2E</td>
</tr>
<tr>
<td>unsigned int</td>
<td>整数值正、0</td>
<td>0, 6, 35102</td>
</tr>
<tr>
<td>short</td>
<td>整数值正、负、0&gt;= 16 位一般为16位</td>
<td>0, -8, 32767</td>
</tr>
<tr>
<td>long</td>
<td>整数值正、负、0&gt;= 32 位一般为32位</td>
<td>0, 78, -217, 301713123194</td>
</tr>
</tbody>
</table>
</div>
</section>
<section>
<div>
<h2 id="const" class="text-xl mt-2 pb-2 font-sans">Const 常量</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">integer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span>
<span class="k">const</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">dob</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1.20</span><span class="p">;</span>
<span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">MyChar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">'c'</span><span class="p">;</span>
</code></pre></div>
</code></pre>
</div>
<ul class="list-disc font-serif">
<li class="ml-8">常量一经分配,无法更改。可以<a href="https://godbolt.org/z/eMWfK6Edq">尝试</a>添加<code>integer = 120;</code>看看会发生什么。</li>
</ul>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<ul class="list-disc font-serif">
<li class="ml-8">常量一经分配,无法更改。可以<a
href="https://godbolt.org/z/eMWfK6Edq">尝试</a>添加<code>integer = 120;</code>看看会发生什么。
</li>
</ul>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">argv</span><span class="p">[])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">intager</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">dob</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1.20</span><span class="p">;</span>
@ -185,41 +256,61 @@
<span class="w"> </span><span class="n">intager</span><span class="p">,</span><span class="n">dob</span><span class="p">,</span><span class="n">MyChar</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div></section><section><div><h2 id="c" class="text-xl mt-2 pb-2 font-sans">C中的控制流</h2>
<ul class="list-disc font-serif">
<li class="ml-8">
<p class="font-serif my-1">语句(statement)可以是代码块 {} 或只是一个独立的语句</p>
<ul class="list-disc font-serif">
<li class="ml-8">if-else</li>
</ul>
<p class="font-serif my-1"><code>if (expr) statement</code></p>
<p class="font-serif my-1"><code>if (x == 0) y++;</code></p>
<p class="font-serif my-1"><code>if (x == 0) {y++;}</code></p>
<p class="font-serif my-1"><code>if (x == 0) {y++; j = j + y;}</code></p>
<p class="font-serif my-1"><code>if (expr) statement1 else statement2</code></p>
<ul class="list-disc font-serif">
<li class="ml-8">switch case</li>
<li class="ml-8">while: <code>while (expr) statement</code></li>
<li class="ml-8">for: <code>for (initialize; check; update) statement</code></li>
</ul>
</li>
</ul>
<p class="font-serif my-1"><a href="https://godbolt.org/z/6o31z4zPW">https://godbolt.org/z/6o31z4zPW</a></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">函数</h2>
<ul class="list-disc font-serif">
<li class="ml-8">在编程中,函数是一段可重复使用的代码块,用于执行特定的任务或完成特定的操作。函数可以接受输入参数,并且可以返回一个值或执行一些操作</li>
<li class="ml-8">代码重用</li>
<li class="ml-8">提高代码可读性</li>
<li class="ml-8">提高代码可测试性(单元测试)</li>
<li class="ml-8">抽象</li>
</ul>
<p class="font-serif my-1"><a href="https://godbolt.org/z/11bxvT8Ga">https://godbolt.org/z/11bxvT8Ga</a></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">数组</h2>
<ul class="list-disc font-serif">
<li class="ml-8">数组就是一整块变量的集合,数组名是数组存放的地址,使用索引确定每个元素的位置</li>
<li class="ml-8">定义unsigned char temp[10] = {0x11,0x12,0x13};</li>
<li class="ml-8">使用printf(“%02x ”,temp[0]);</li>
</ul>
<p class="font-serif my-1"><a href="https://godbolt.org/z/rzo6o1bsE">https://godbolt.org/z/rzo6o1bsE</a></p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="c" class="text-xl mt-2 pb-2 font-sans">C中的控制流</h2>
<ul class="list-disc font-serif">
<li class="ml-8">
<p class="font-serif my-1">语句(statement)可以是代码块 {} 或只是一个独立的语句</p>
<ul class="list-disc font-serif">
<li class="ml-8">if-else</li>
</ul>
<p class="font-serif my-1"><code>if (expr) statement</code></p>
<p class="font-serif my-1"><code>if (x == 0) y++;</code></p>
<p class="font-serif my-1"><code>if (x == 0) {y++;}</code></p>
<p class="font-serif my-1"><code>if (x == 0) {y++; j = j + y;}</code></p>
<p class="font-serif my-1"><code>if (expr) statement1 else statement2</code></p>
<ul class="list-disc font-serif">
<li class="ml-8">switch case</li>
<li class="ml-8">while: <code>while (expr) statement</code></li>
<li class="ml-8">for: <code>for (initialize; check; update) statement</code></li>
</ul>
</li>
</ul>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/j8s5TEb7a">https://godbolt.org/z/j8s5TEb7a</a></p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">函数</h2>
<ul class="list-disc font-serif">
<li class="ml-8">在编程中,函数是一段可重复使用的代码块,用于执行特定的任务或完成特定的操作。函数可以接受输入参数,并且可以返回一个值或执行一些操作</li>
<li class="ml-8">代码重用</li>
<li class="ml-8">提高代码可读性</li>
<li class="ml-8">提高代码可测试性(单元测试)</li>
<li class="ml-8">抽象</li>
</ul>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/11bxvT8Ga">https://godbolt.org/z/11bxvT8Ga</a></p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">数组</h2>
<ul class="list-disc font-serif">
<li class="ml-8">数组就是一整块变量的集合,数组名是数组存放的地址,使用索引确定每个元素的位置</li>
<li class="ml-8">定义unsigned char temp[10] = {0x11,0x12,0x13};</li>
<li class="ml-8">使用printf(“%02x ”,temp[0]);</li>
</ul>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/rzo6o1bsE">https://godbolt.org/z/rzo6o1bsE</a></p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(){</span>
<span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">temp</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0x15</span><span class="p">,</span><span class="mh">0x22</span><span class="p">};</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"temp address: %p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">temp</span><span class="p">);</span>
@ -228,141 +319,253 @@
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">字符串</h2>
<ul class="list-disc font-serif">
<li class="ml-8">字符串是一种特殊的数组,以<code>'\0'</code>结束。</li>
<li class="ml-8">使用 <code>&lt;string.h&gt;</code> 标准库进行更多操作。</li>
</ul>
<p class="font-serif my-1"><a href="https://godbolt.org/z/3jrrvchE1">https://godbolt.org/z/3jrrvchE1</a>
<img alt="static" src="./static/img/ace07efc8ff64ccfa8619a88f51b47d7.png"/></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">字符串</h2>
<ul class="list-disc font-serif">
<li class="ml-8">使用 <code>&lt;string.h&gt;</code> 标准库进行更多操作。</li>
</ul>
<p class="font-serif my-1"><a href="https://godbolt.org/z/Yrj3dfxKx">https://godbolt.org/z/Yrj3dfxKx</a>
<img alt="static" src="./static/img/853203fa7f4948f18d30f0d4f2586165.png"/></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">宏定义</h2>
<ul class="list-disc font-serif">
<li class="ml-8"><code>#define</code> 是文本替换,比如 <code>#define MAX 1000</code></li>
<li class="ml-8">C预处理器先处理源文件替换宏并包含文件。</li>
</ul>
<p class="font-serif my-1"><img alt="static" src="./static/img/f9a01408398844e9b4a0538adaf6c7ca.png"/></p>
<p class="font-serif my-1"><a href="https://godbolt.org/z/aMPxbrMbs">https://godbolt.org/z/aMPxbrMbs</a></p>
<p class="font-serif my-1">gcc -o test test.c -save-temps</p>
<p class="font-serif my-1">关于这块,比较好玩的就是微软早期路径长度在编写时使用了宏定义
<code>#define MAX_PATH 260</code>
导致最长路径除了”C:\”之外只能有255个字符来指代路径了虽然现在支持在注册表里面进行更改不过会引发一些神奇的小bug这个就留给大家进行探索了</p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">预处理</h2>
<p class="font-serif my-1">C 源文件在编译器看到代码之前首先经过预处理器 CPP
CPP 用单个空格替换注释
CPP 命令以“#”开头
- #include "file.h" /<em> 将 file.h 插入到文件 </em>/
- #include <stdio.h> /<em> 在标准位置查找文件,但没有实际区别 </em>/
- #define PI (3.14159) /<em> 定义常量 </em>/
- #if/#endif /<em> 有条件地包含文本 </em>/</stdio.h></p>
<p class="font-serif my-1">使用 gcc 的 save-temps 选项查看预处理结果
完整文档位于http:// /gcc.gnu.org/onlinedocs/cpp/</p></div></section><section><div><h2 id="cat-break" class="text-xl mt-2 pb-2 font-sans">Cat Break!</h2>
<p class="font-serif my-1"><img alt="static" src="./static/img/11693378e53e45449de8116f8ea226bf.png"/></p></div></section></section><section><section><div><h2 id="agenda-part-2" class="text-xl mt-2 pb-2 font-sans">Agenda Part 2</h2>
<p class="font-serif my-1"><img class="float-right" src="./static/img/f5d9dbb8e76c4082b7e17bb8ac138338.png" width=""/></p>
<ul class="list-disc font-serif">
<li class="ml-8">内存与变量</li>
<li class="ml-8">多维数组</li>
<li class="ml-8">指针的初步介绍</li>
<li class="ml-8">指针的进一步理解</li>
<li class="ml-8">指针与数组</li>
<li class="ml-8">指针与const</li>
<li class="ml-8">void指针</li>
<li class="ml-8">警惕UB</li>
</ul></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">内存</h2>
<p class="font-serif my-1"><img alt="static" src="./static/img/8334e94e81644ed1a3bdb9a75ceed930.png"/></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">变量与垃圾值</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">字符串</h2>
<ul class="list-disc font-serif">
<li class="ml-8">字符串是一种特殊的数组,以<code>'\0'</code>结束。</li>
<li class="ml-8">使用 <code>&lt;string.h&gt;</code> 标准库进行更多操作。</li>
</ul>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/3jrrvchE1">https://godbolt.org/z/3jrrvchE1</a></p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;string.h&gt;</span>
<span class="c1">// 字符串以\0结尾</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(){</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">str1</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"I Can Eat Glass"</span><span class="p">;</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">str2</span><span class="p">[</span><span class="mi">20</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"I Can Eat Glass"</span><span class="p">;</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"str1:%s</span><span class="se">\n</span><span class="s">size:%lu</span><span class="se">\n</span><span class="s">str2:%s</span><span class="se">\n</span><span class="s">size:%lu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>\
<span class="w"> </span><span class="n">str1</span><span class="p">,</span><span class="n">strlen</span><span class="p">(</span><span class="n">str1</span><span class="p">),</span><span class="n">str2</span><span class="p">,</span><span class="n">strlen</span><span class="p">(</span><span class="n">str2</span><span class="p">));</span>
<span class="p">}</span>
</code></pre>
</div>
<p class="font-serif my-1">使用<code>sizeof</code><code>strlen</code>都能获取字符串长度,它们有什么区别呢?</p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">字符串</h2>
<ul class="list-disc font-serif">
<li class="ml-8">使用 <code>&lt;string.h&gt;</code> 标准库进行更多操作。</li>
</ul>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/sz8Ms1nTj">https://godbolt.org/z/sz8Ms1nTj</a></p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">宏定义</h2>
<ul class="list-disc font-serif">
<li class="ml-8"><code>#define</code> 是文本替换,比如 <code>#define MAX 1000</code></li>
<li class="ml-8">C预处理器先处理源文件替换宏并包含文件。</li>
</ul>
<p class="font-serif my-1"><img alt="static"
src="./static/img/3e722aa87b43462fa5629d7d5b542743.png" /></p>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/aMPxbrMbs">https://godbolt.org/z/aMPxbrMbs</a></p>
<p class="font-serif my-1">gcc -o test test.c -save-temps</p>
<p class="font-serif my-1">关于这块,比较好玩的就是微软早期路径长度在编写时使用了宏定义
<code>#define MAX_PATH 260</code>
导致最长路径除了”C:\”之外只能有255个字符来指代路径了虽然现在支持在注册表里面进行更改不过会引发一些神奇的小bug这个就留给大家进行探索了
</p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">预处理</h2>
<p class="font-serif my-1">C 源文件在编译器看到代码之前首先经过预处理器 CPP
CPP 用单个空格替换注释
CPP 命令以“#”开头
- #include "file.h" /<em> 将 file.h 插入到文件 </em>/
- #include <stdio.h> /<em> 在标准位置查找文件,但没有实际区别 </em>/
- #define PI (3.14159) /<em> 定义常量 </em>/
- #if/#endif /<em> 有条件地包含文本 </em>/</stdio.h>
</p>
<p class="font-serif my-1">使用 gcc 的 save-temps 选项查看预处理结果
完整文档位于http:// /gcc.gnu.org/onlinedocs/cpp/</p>
</div>
</section>
<section>
<div>
<h2 id="cat-break" class="text-xl mt-2 pb-2 font-sans">Cat Break!</h2>
<p class="font-serif my-1"><img alt="static"
src="./static/img/ff8bee4432db4457af8cb7accf38a3c8.png" /></p>
</div>
</section>
</section>
<section>
<section>
<div>
<h2 id="agenda-part-2" class="text-xl mt-2 pb-2 font-sans">Agenda Part 2</h2>
<p class="font-serif my-1"><img class="float-right"
src="./static/img/d77fc3c248284ce88073e56b5498914f.png" width="" /></p>
<ul class="list-disc font-serif">
<li class="ml-8">内存与变量</li>
<li class="ml-8">多维数组</li>
<li class="ml-8">指针的初步介绍</li>
<li class="ml-8">指针的进一步理解</li>
<li class="ml-8">指针与数组</li>
<li class="ml-8">指针与const</li>
<li class="ml-8">void指针</li>
<li class="ml-8">警惕UB</li>
</ul>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">内存</h2>
<p class="font-serif my-1"><img alt="static"
src="./static/img/f9b5785898c74ccb93861c27c0dd6460.png" /></p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">变量与垃圾值</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="kt">float</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1.5f</span><span class="p">;</span>
</code></pre></div>
</code></pre>
</div>
<p class="font-serif my-1">变量可以被分为四个部分:
int :类型
b :标识
-1 :值
&amp;b :地址</p>
<p class="font-serif my-1"><a href="https://godbolt.org/z/ocbrj7s85">https://godbolt.org/z/ocbrj7s85</a>
<img alt="static" src="./static/img/99aca2ebff314be7a91decceb33ec5c3.png"/></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">数组的越界行为</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="p">};</span>
</code></pre></div>
<p class="font-serif my-1">变量可以被分为四个部分:
int :类型
b :标识
-1 :值
&amp;b :地址</p>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/ocbrj7s85">https://godbolt.org/z/ocbrj7s85</a>
<img alt="static" src="./static/img/aa1e8bce43c640a3bb4c63867e2f68a0.png" />
</p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">数组的越界行为</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="p">};</span>
</code></pre>
</div>
<p class="font-serif my-1">array 这个标识符是什么呢?</p>
<p class="font-serif my-1"><img alt="array2" src="./static/img/5f2242615f2b47218fcb51f6fca11a7c.png"/></p>
<p class="font-serif my-1">能不能访问array[5]呢?</p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">多维数组</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">},{</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">}};</span>
</code></pre></div>
<p class="font-serif my-1">array 这个标识符是什么呢?</p>
<p class="font-serif my-1"><img alt="array2"
src="./static/img/2325487fe87c4df293bbfbe7986d8fe9.png" /></p>
<p class="font-serif my-1">能不能访问array[5]呢?</p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">多维数组(目前了解即可)</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">},{</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">}};</span>
</code></pre>
</div>
<p class="font-serif my-1">matrix的类型: int[2][2]
sizeof matrix = sizeof(int) * 2 * 2</p>
<p class="font-serif my-1"><a href="https://godbolt.org/z/Mbq513KnG">https://godbolt.org/z/Mbq513KnG</a></p>
<p class="font-serif my-1"><img alt="2dmatrix" src="./static/img/56425f4f2fc74c3bb8bd7dbb8f049212.png"/></p>
<p class="font-serif my-1">问:下面哪种写法是正确的?</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">matrix</span><span class="p">[][</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">};</span>
<p class="font-serif my-1">matrix的类型: int[2][2]
sizeof matrix = sizeof(int) * 2 * 2</p>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/Mbq513KnG">https://godbolt.org/z/Mbq513KnG</a></p>
<p class="font-serif my-1"><img alt="2dmatrix"
src="./static/img/12462e9d74c8489bb110338d748228c6.png" /></p>
<p class="font-serif my-1">(问:下面哪种写法是正确的?)</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">matrix</span><span class="p">[][</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">};</span>
<span class="kt">int</span><span class="w"> </span><span class="n">matrix</span><span class="p">[</span><span class="mi">2</span><span class="p">][]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">};</span>
</code></pre></div></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针</h2>
<p class="font-serif my-1">指针也可以看作一个变量,我们对其的定义是这样的</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针</h2>
<p class="font-serif my-1">指针也可以看作一个变量,我们对其的定义是这样的</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
</code></pre></div>
</code></pre>
</div>
<p class="font-serif my-1">int<em> : int表示指针指向的元素类型 </em>代表的是我要定义一个指针
p : 标识符
&amp;a : 指针的值(指针指向的地址)
&amp;p : 存放指针的地址</p>
<p class="font-serif my-1"><img alt="static" src="./static/img/bf0df0ad37274bcda7c846a9574124f0.png"/></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针初始化与使用</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="p">;</span>
<p class="font-serif my-1">int<em> : int表示指针指向的元素类型 </em>代表的是我要定义一个指针
p : 标识符
&amp;a : 指针的值(指针指向的地址)
&amp;p : 存放指针的地址</p>
<p class="font-serif my-1"><img alt="static"
src="./static/img/276ea65bb0824b8ab636b2eaea91d478.png" /></p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针初始化与使用</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="p">;</span>
<span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// 危险p是野指针</span>
</code></pre></div>
</code></pre>
</div>
<p class="font-serif my-1">应该这么做</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
</code></pre></div>
<p class="font-serif my-1">应该这么做</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
</code></pre>
</div>
<p class="font-serif my-1">当要使用指针指向的值的时候,可以对指针进行解引用</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<p class="font-serif my-1">当要使用指针指向的值的时候,可以对指针进行解引用</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
<span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">*</span><span class="n">p</span><span class="p">);</span>
</code></pre></div></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针的作用</h2>
<p class="font-serif my-1">指针是C语言的精髓广泛运用于传参等方面</p>
<p class="font-serif my-1"><a href="https://godbolt.org/z/8MeTzaGjo">https://godbolt.org/z/8MeTzaGjo</a></p>
<p class="font-serif my-1">看完这个例子后想一想scanf("%d",&amp;a);为什么需要取a的地址</p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针数组和数组指针</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
<span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">)[</span><span class="mi">10</span><span class="p">];</span>
<span class="c1">// []运算符的优先级&gt;*运算符的优先级</span>
</code></pre></div>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
<span class="c1">// 化为int* array[] -&gt; 存放着 10个指向int类型的指针 的数组</span>
<span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">)[</span><span class="mi">10</span><span class="p">];</span>
<span class="c1">// 化为int pointer[] -&gt; 指向 存放了10个int类型的数组 的指针</span>
</code></pre></div></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">加大难度</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">)[</span><span class="mi">20</span><span class="p">][</span><span class="mi">10</span><span class="p">];</span>
</code></pre></div>
<p class="font-serif my-1">p是什么
p是指针还是数组
p的类型是什么</p>
<p class="font-serif my-1">想明白之后点击链接查看答案
<a href="https://godbolt.org/z/hv6rnTj5Y">https://godbolt.org/z/hv6rnTj5Y</a></p></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">数组和指针的关系</h2>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="c1">// p1的类型是int* , array的类型是int[10]</span>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针的作用</h2>
<p class="font-serif my-1">指针是C语言的精髓广泛运用于传参等方面</p>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/8MeTzaGjo">https://godbolt.org/z/8MeTzaGjo</a></p>
<p class="font-serif my-1">看完这个例子后想一想scanf("%d",&amp;a);为什么需要取a的地址</p>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">数组和指针的关系</h2>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="c1">// p1的类型是int* , array的类型是int[10]</span>
<span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
<span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">p1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">;</span>
<span class="c1">// p2的类型是int*[2] , matrix的类型是int[][]</span>
<span class="kt">int</span><span class="w"> </span><span class="n">matrix</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">p2</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">matrix</span><span class="p">;</span>
</code></pre></div>
</code></pre>
</div>
<p class="font-serif my-1">数组与其元素类型的指针存在隐式转换,指向数组首元素的指针可通过数组类型表达式初始化。</p>
<p class="font-serif my-1">问:二维数组可以和二维指针相互转化吗</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<p class="font-serif my-1">数组与其元素类型的指针存在隐式转换,指向数组首元素的指针可通过数组类型表达式初始化。</p>
<p class="font-serif my-1">问:二维数组可以和二维指针相互转化吗</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<span class="kt">int</span><span class="o">**</span><span class="w"> </span><span class="n">ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">;</span>
<span class="c1">//可以这么做吗</span>
</code></pre></div></div></section><section><div><h2 id="const" class="text-xl mt-2 pb-2 font-sans">const与指针的关系</h2>
<p class="font-serif my-1">前文提到const就像一把锁被它锁到的事物不能被更改</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="const" class="text-xl mt-2 pb-2 font-sans">const与指针的关系</h2>
<p class="font-serif my-1">前文提到const就像一把锁被它锁到的事物不能被更改</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
<span class="c1">// 锁住指针p指向的int类型变量</span>
<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
@ -370,36 +573,61 @@ p的类型是什么</p>
<span class="kt">int</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
<span class="c1">// 一起锁</span>
<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
</code></pre></div>
</code></pre>
</div>
<p class="font-serif my-1">假设你有一段音频文件你想要进行播放那你绝对不想播放器修改你的音频那你可以使用const来设计函数这样就绝对无法更改了</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">void</span><span class="w"> </span><span class="nf">wav_player</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">ptr</span><span class="p">);</span>
</code></pre></div></div></section><section><div><h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针的加减法</h2>
<p class="font-serif my-1">加、减
加、减整数n -&gt; 指向后/前第n个元素</p>
<p class="font-serif my-1">指针相减
表示指针之间的偏移量</p>
<p class="font-serif my-1">仅当原指针和结果指针都指向同一数组中的元素,或该数组的尾后一位置,行为才有定义。</p>
<p class="font-serif my-1"><a href="https://godbolt.org/z/q9M6W81x3">https://godbolt.org/z/q9M6W81x3</a></p></div></section><section><div><h2 id="void" class="text-xl mt-2 pb-2 font-sans">void*</h2>
<p class="font-serif my-1">使用void类型指针的时候无法进行解引用也无法进行加减运算
使用void*类型的指针的时候一定要对其进行强制类型转化</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="o">*</span><span class="p">((</span><span class="kt">int</span><span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">));</span>
</code></pre></div></div></section><section><div><h2 id="ub" class="text-xl mt-2 pb-2 font-sans">警惕UB(未定义行为)</h2>
<p class="font-serif my-1">我们很多时候需要警惕未定义行为,就比如说</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</code></pre></div>
<p class="font-serif my-1">假设你有一段音频文件你想要进行播放那你绝对不想播放器修改你的音频那你可以使用const来设计函数这样就绝对无法更改了</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="kt">void</span><span class="w"> </span><span class="nf">wav_player</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">ptr</span><span class="p">);</span>
</code></pre>
</div>
</div>
</section>
<section>
<div>
<h2 id="_1" class="text-xl mt-2 pb-2 font-sans">指针的加减法</h2>
<p class="font-serif my-1">加、减
加、减整数n -&gt; 指向后/前第n个元素</p>
<p class="font-serif my-1">指针相减
表示指针之间的偏移量</p>
<p class="font-serif my-1">仅当原指针和结果指针都指向同一数组中的元素,或该数组的尾后一位置,行为才有定义。</p>
<p class="font-serif my-1"><a
href="https://godbolt.org/z/q9M6W81x3">https://godbolt.org/z/q9M6W81x3</a></p>
</div>
</section>
<section>
<div>
<h2 id="ub" class="text-xl mt-2 pb-2 font-sans">警惕UB(未定义行为)</h2>
<p class="font-serif my-1">我们很多时候需要警惕未定义行为,就比如说</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</code></pre>
</div>
<p class="font-serif my-1">i在这里多次使用且数值发生了改变没人知道a[i]先执行还是++i先执行</p>
<p class="font-serif my-1">还有就是</p>
<div class="codehilite"><pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="c1">// i=0</span>
<p class="font-serif my-1">i在这里多次使用且数值发生了改变没人知道a[i]先执行还是++i先执行</p>
<div class="codehilite">
<pre class="bg-gray-100 overflow-x-auto rounded p-2 mb-2 mt-2"><span/><code><span class="c1">// i=0</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="o">+</span><span class="n">f</span><span class="p">(</span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="o">-</span><span class="n">f</span><span class="p">(</span><span class="n">i</span><span class="o">++</span><span class="p">);</span>
</code></pre></div>
</code></pre>
</div>
<p class="font-serif my-1">虽然在最后的结果上编译器会将其翻译为int a = (f(i++)+f(i++))-f(i++);
但没人知道哪个f(i++)最先执行,可能是第一个,也可能是第三个</p></div></section><section><div><h2 id="ask-time" class="text-xl mt-2 pb-2 font-sans">Ask Time</h2>
<p class="font-serif my-1"><img alt="static" src="./static/img/cdfa9e87117d4baf82ca4e2f5de0b837.png"/></p></div></section></section>
<p class="font-serif my-1">虽然在最后的结果上编译器会将其翻译为int a = (f(i++)+f(i++))-f(i++);
但没人知道哪个f(i++)最先执行,可能是第一个,也可能是第三个</p>
<blockquote>
<p class="font-serif my-1">详情请参考
https://zh.cppreference.com/w/c/language/behavior
https://zh.cppreference.com/w/c/language/eval_order</p>
</blockquote>
</div>
</section>
<section>
<div>
<h2 id="ask-time" class="text-xl mt-2 pb-2 font-sans">Ask Time</h2>
<p class="font-serif my-1"><img alt="static"
src="./static/img/d2218f607d3a4237973e1fbd7506fb67.png" /></p>
</div>
</section>
</section>
</div>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,69 +0,0 @@
#include <stdio.h>
// C中的控制流
int main(int argc,char* argv[]){
// 条件分支
// if else
if(argc == 1){
printf("args = NULL\n");
}else if(argc == 2){
printf("args = %d\n",argc-1);
printf("argv:%s\n",argv[1]);
}else{
printf("args = %d\n",argc-1);
}
printf("\n");
//switch
switch (argc)
{
case 1:
printf("args = NULL\n");
break;
case 2:
printf("args = %d\n",argc-1);
printf("argv:%s\n",argv[1]);
break;
default:
printf("args = %d\n",argc-1);
break;
}
// 三元表达式
argc == 2? printf("yes\n\n") : printf("no\n\n");
// 循环结构
int i=10;
while(i!=0){
printf("%d ",i);
i--;
}printf("\n");
do{
printf("%d ",i);
i++;
}while(i<10);
printf("\n");
for(i=0;i<10;i++){
printf("%d ",i);
}printf("\n\n");
// 跳转控制语句
/**
* @param break switch语句
* @param continue
*/
printf("goto语句示范:\n");
int go = 0;
lable:
printf("%d ",go);
if(go < 3){
go++;
goto lable;
}
printf("\n");
}

View File

@ -1,20 +0,0 @@
#include <stdio.h>
// 函数声明
int fact(int);
int main(){
printf("%d",fact(5));
}
// 函数定义
int fact(int n){
if (n<=1){
return 1;
}
int sum=1,i;
for(i=1;i<=n;i++){
sum*=i;
}
return sum;
}

View File

@ -1,19 +0,0 @@
#include <stdio.h>
int main(){
// 定义
unsigned char temp[10] = {0x11,0x15,0x22};
// 数组的地址
printf("temp address: %p\n",temp);
// 更改
temp[3] = 0xa8;
// 使用
for (size_t i=0;i<10;i++){
printf("%02x ",temp[i]);
}
printf("\n");
return 0;
}

View File

@ -1,12 +0,0 @@
#include <stdio.h>
#include <string.h>
// 字符串以\0结尾
int main(){
char str1[] = "I Can Eat Glass";
char str2[20] = "I Can Eat Glass";
printf("str1:%s\nsize:%lu\nstr2:%s\nsize:%lu\n",\
str1,strlen(str1),str2,strlen(str2));
}

View File

@ -1,32 +0,0 @@
#include <stdio.h>
#include <string.h>
// string.h标准库的几个常用函数
int main(){
char str1[] = "I Can Eat Glass";
char str2[] = "我能吞下玻璃而不伤身体";
printf("str1:%s\nsize:%lu\nstr2:%s\nsize:%lu\n",\
str1,strlen(str1),str2,strlen(str2));
// 字符串比较
int h = strcmp(str1,str2);
if(h!=0){
if(h>0){
printf("str1更大\n");
}
else{
printf("str2更大\n");
}
}
else{
printf("str1和str2一样大\n");
}
// 字符串赋值
strcpy(str1,"I love windows\n");
printf("str1:%s",str1);
return 0;
}

View File

@ -1,10 +0,0 @@
#include <stdio.h>
#define MAX 1000
int main(int argc,char* argv[])
{
printf("MAX: %d",MAX);
return 0;
}

View File

@ -1,13 +0,0 @@
#include <stdio.h>
int main(){
unsigned int a;
int b;
float c;
printf("a,b,c各元素的值\n");
printf("%u %d %f\n",a,b,c);
printf("a,b,c各元素的地址\n");
printf("%p %p %p\n",&a,&b,&c);
return 0;
}

View File

@ -1,10 +0,0 @@
#include <stdio.h>
int main(void) {
int matrix[2][2] = { {1, 2}, {3, 4} };
printf("%p %p %p %p\n", &matrix[0][0], &matrix[0][1], &matrix[1][0], &matrix[1][1]);
printf("sizeof matrix: %d\n", sizeof matrix);
printf("sizeof matrix[0]: %d\n", sizeof matrix[0]);
printf("sizeof matrix[1]: %d\n", sizeof matrix[1]);
return 0;
}

View File

@ -1,23 +0,0 @@
#include <stdio.h>
void swap1(int x, int y) {
int t = x;
x = y;
y = t;
}
void swap2(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
int main(void) {
int a = 1, b = 2;
printf("a = %d, b = %d\n", a, b);
swap1(a, b);
printf("a = %d, b = %d after swap1\n", a, b);
swap2(&a, &b);
printf("a = %d, b = %d after swap2\n", a, b);
return 0;
}

View File

@ -1,7 +0,0 @@
#include <stdio.h>
int main(void) {
// int* (*p)[20][10];
// p是一个指向 存放int*类型的二维数组 的指针
}

View File

@ -1,14 +0,0 @@
#include <stdio.h>
int main(void) {
int array[10] = {0};
printf("array = %p\n", array);
int *p1 = array, *p2 = array;
printf("p1 = %p, p2 = %p\n", p1, p2);
p1 = p1 + 1;
printf("p1 = %p, p2 = %p\n", p1, p2);
p2 = p2 + 9;
printf("p1 = %p, p2 = %p\n", p1, p2);
printf("p2 - p1 = %u\n", (unsigned int)(p2-p1));
return 0;
}

View File

@ -1,5 +0,0 @@
> 在本目录下打开终端,输入
```bash
make
```
> 在`./build`目录下生成对应的可执行文件

View File

@ -1,21 +0,0 @@
CC = gcc
CFLAGS = -Wall -g
SRC = $(wildcard *.c)
EXE = $(patsubst %.c, ./build/%, $(SRC))
.PHONY: all
all: build_dir $(EXE)
./build/%: %.c
$(CC) $(CFLAGS) -o $@ $<
build_dir:
mkdir -p build
.PHONY: clean
clean:
rm -rf ./build

View File

@ -5,9 +5,10 @@ SOURCE=("$WORK_DIR/index.html" "$WORK_DIR/Lectures")
mkdir -p "$SITE_DIR"
cp -r "${SOURCE[@]}" "$SITE_DIR"
CODE_DIR="$WORK_DIR/Others/Codes"
JEKLLY_TOOL_DIR="$WORK_DIR/Tools/ghpages-mini-fileserver"
cp -r "$CODE_DIR" "$JEKLLY_TOOL_DIR/resources"
RESOURCE="$JEKLLY_TOOL_DIR/resources"
mkdir -p "$RESOURCE"
find "$WORK_DIR/Lectures" -type d -name "Codes" -exec cp -r "{}" "$RESOURCE" \;
bash "$JEKLLY_TOOL_DIR/prenodes.sh"
cd "$JEKLLY_TOOL_DIR" && bundle exec jekyll build --baseurl "$1"
cp -r "$JEKLLY_TOOL_DIR/_site" "$SITE_DIR"