、1,stdin(键盘输入)
输入分为很多种有stdin的键盘输入,还有file*的文件输入
可以进行键盘输入的几种函数如下
gets fgets scanf getchar
前来两者读取的是一行,读到"\n"截至,但gets会把\n去掉,fgets不会,但是都会加上一个"\0"
这两个返回的值为首地址(失败都返回null(是空地址地址不让访问))
gets的用法如下
char *gets(char *str);
fgets的用法如下

去掉"\n"的方法

简洁方法如下

后两者的读取是单个字符串和字符
getchar返回ascll码,scanf返回争取读取的个数(两者读取失败都返回eof(在值上都等于-1))
注意getchar返回的是int类型,因为读取失败EOF的值为-1需要int来存储,所以这样的代码是错的
#include <stdio.h>
int main()
{ char ch; // 错误:char 范围是 -128~127 或 0~255,无法正确存储 EOF(-1)
while ((ch = getchar()) != EOF)
{ // 可能永远无法退出循环 printf("你输入的字符:%c\n", ch); } printf("读取到 EOF,结束\n"); return 0; }
日常使用中,我们经常需要手动去掉 \n(比如用 strtok(buf, "\n") 或 buf[strcspn(buf, "\n")] = '\0'),就是因为 \n 会被 fgets 保留在字符串中,且在 \0 之前。
他们的区别如图

还有一点
2.动态分配二维数组
二维数组的定义时需要用int**
同时存储的类型为地址的大小

3,预处理




具体原理如下



宏定义易错问题
一般情况宏定义文件参与计算会按照如下规律


4,math.h
常见的函数


5,stdlib.h
较为常见的是malloc的使用:
用法为:int*p=(int*)malloc(字节数)
存储在堆区需要使用stdlib.h进行调用
6,指针
对于数组的指针,清楚数组本身的指针&arr和数组的首元素的指针arr之间的区别,其中还有语法让糖的关系
如我们传入











memcpy(copy_arr, src_arr, len * sizeof(int));意思是数组的copy
7,位运算符
按位与(&)
- 核心用途:判断某一位是否为 1 、保留指定位 、清零其他位。
- 示例:判断数字 n 的第 3 位(从 0 开始数)是否为 1:
if n & (1 << 3):(若结果非 0,说明第 3 位是 1)。
按位异或(^)
-
核心特性:
- 一个数异或自身等于 0(
a ^ a = 0); - 一个数异或 0 等于自身(
a ^ 0 = a);
- 一个数异或自身等于 0(
-
核心用途:交换两个数 (无需临时变量)、找出数组中唯一出现一次的数。
-
示例(交换 a 和 b):
a = 6 b = 3 a = a ^ b # a=5 b = a ^ b # b=6 a = a ^ b # a=3移位运算(<</>>)
-
左移:高效的乘法(
n << 1等价于n * 2,n << 2等价于n * 4); -
右移:高效的除法(
n >> 1等价于n // 2,仅对正数有效); -
注意:移位运算不会改变原数,而是返回新值。
8,大小端
网络传输一般为大端
计算机处理一般为小端

直观对比
- 大端序:
0x00地址存0x12(最高位字节),0x03地址存0x78(最低位字节),和我们手写数字12 34 56 78的顺序一致。 - 小端序:
0x00地址存0x78(最低位字节),0x03地址存0x12(最高位字节),顺序完全反过来。