考点
2866字约10分钟
2025-4-23
进制的转换
- 二进制是由
0
和1
组成的,由0b
开头的 - 八进制是由
0
~7
组成的,并且以0
开头 - 十进制就是普通的数字,不需要加任何前缀
- 十六进制是
0
~9
和a
~f
组成的,由0x
开头(在十六进制中,a
表示10
,b
表示11
,以此类推,到F
15为止)
细节:0xf0
其二进制
(十六进制)0xf == 15(十进制)
(十进制)15 == 1111(二进制)
(十六进制)0 == 0000(二进制)
所以 (十六进制)0xf0 == 11110000(二进制)
转十进制
十进制转别的进制
字符串函数
strlen:获取字符串长度
strcat:拼接两个字符串
strcpy:复制字符串
strcmp:比较两个字符串 // 两个字符串如果一样的话,则返回0,即假
strlwr:将字符串变成小写
strupr:将字符串变成大写
数学函数
// 预编译
#include <stdio.h>
// 常见数学函数库
#include <math.h>
void main()
{
double res1 = pow(2, 3); // 2的3次方
printf("%lf\n", res1); // 8.00
double res2 = sqrt(4); // 2的平方根
printf("%lf\n", res2); // 2.00
double res3 = ceil(2.3); // 向上取整
printf("%lf\n", res3); // 3.00
double res = floor(2.3); // 向下取整
printf("%lf\n", res); // 2.00
double res4 = fabs(-2); // 绝对值
printf("%lf\n", res4); // 2.00
}
占位符
%d int型整数(常数)
%f 浮点数
%s 字符串
%c 单个字符
%ld Long型整数
%lld Long Long型整数
%zu sizeof:查看字节大小
%f float
%lf double
%.2f float保留两位小数
%.2lf double保留两位小数
%% 输出百分号字符本身
%p 输出变量的地址
%o 将十进制数以八进制的形式输出出来
%#o 强制在八进制前添加一个0(因为转换之后的结果前面是没有0的)
%x 将十进制数以十六进制的形式输出出来
%#x 和%#o同理
%*d 这里的 * 是赋值抑制字符,它表示读取一个十进制整数,但不把这个值赋给任何变量,也就是跳过这个输入
标识符的命名规则
组成字符:只能由字母(包括大写和小写)、数字和下划线(_)组成。
例如,
count
、_value
、num123
都是合法的标识符组成形式。开头字符:必须以字母或者下划线开头,不能以数字开头
比如
a1
是合法的,1a
则不合法。不能与关键字重名:不能使用 C 语言的关键字(如
if
、else
、int
、float
、while
等)作为标识符,否则会引起编译错误。区分大小写:C 语言对标识符大小写敏感,即
Max
和max
被视为两个不同的标识符。长度限制:C 标准没有规定标识符的最大长度,但各个编译器都有自己的限制。
例如,有些编译器可能限制标识符长度为 31 个字符,实际使用中一般不用太担心,正常长度的标识符基本都能满足。
指针
int a = 123;
int *p = &a;
printf("%d\n", a); // 123
printf("%p\n", *p); // 变量地址:000000000000007B
printf("%d\n", *p); // 123
printf("%p\n", p); // 6422036(???)
p; // 表示一个值
*p; // %d时,表示一个值,%p时,表示该值的内存地址
// 一维数组
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%d", *a);
书写形式 | 等价形式 |
---|---|
a | &a[0] |
p | &a[0] |
*a | a[0] |
*p | a[0] |
*(p + 1) | a[0 + 1] |
*p + 2 | a[0 + 2] |
*(p + 1) + 2 | a[0 + 1] + 2 |
a + 1 | &a[1] |
p + 1 | &a[1] |
// 二维数组
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
// 定义一个指针数组
int *ptrArr[3];
// 循环将二维数组每行首地址赋给指针数组
for (int i = 0; i < 3; i++)
{
ptrArr[i] = a[i];
}
// 定义指向指针的指针并指向指针数组
int **p = ptrArr;
printf("%d", p[1]);
书写形式 | 等价形式 |
---|---|
**p | a[0][0] |
**(p + 1) | a[0 + 1][0] |
*(*P + 2) | a[0][0 + 2] |
*(*(p + 1) + 2) | a[0 + 1][0 + 2] |
*(p[1] + 2) | a[1][0 + 2] |
p[1] | &a[1][0] |
p[1] + 2 | &a[1][2] |
有符号和没符号
%u
和 unsigned
表示有符号
考点:设一个数据类型为两个字节,则为该数据类型的最大值:最大值为 0 ~ 65,535
或者该数据类型的结果为 -1
,输出 %u
的结果是什么,结果为 65,535
运算符
// 将对比数转成二进制
5 & 4;
5: 101
4: 100
100
5 & 4 = 4
按位与 &
两个数都是1,结果才为1(1和1,结果才为1),否则为0(1和0,0和0,其结果都是0)
按位或 |
两位数中只要有1个1,其结果为1(1和0,1和1,其结果都为1),否则为0(0和0,结果为0)
按位异或 ^
两位数中是一个0加一个1组合的(1和0,结果为1),结果为1,否则为0(1和1,0和0,其结果都为0)
按位取反 ~
1变0,0变1
~ 5取反
-(5 + 1) = -6
~ -5取反
5 - 1 = 4
左移右移<< >>
左移:<<
,例如a<<n
,表示将a
的二进制位向左移动n
位。
01010 << 4
010100000
右移:>>
,例如a>>n
,表示将a
的二进制位向右移动n
位。
010100000 >> 4
01010
结构体
struct student
{
char name[10]; 0 1 2 3 4 5 6 7 8 9
char sex; 10 11
int age; 12 13 14 15
struct
{
int year; 0 1 2 3
int month; 4 5 6 7
int day; 8 9 10 11
} birth;
} stul;
求 stul
结构体的大小:
嵌套结构体的大小分开算,里面的结构体大小为 12,外面的结构体大小为 20,所以该嵌套结构体的大小为 32
类型转换
大转小
int i = 289;
char y = 'a';
y = i;
289 ==转二进制== 1 00100001
因为char只能存一个字节,而一个字节有八位
所以 char y 只获取到 00100001
即 char y = 33;
读取文件
fopen的几种模式 | 描述 |
---|---|
r | 只读模式 |
w | 只写模式 细节1:文件不存在,创建新文件 细节2:文件已存在,清空文件 |
a | 追加写入模式 细节1:文件不存在,创建新文件 细节2:文件已存在,不清空文件,续写 |
rb | 只读模式(读取二进制文件,例如:图片、视频之类的) |
wb | 只写模式(操作二进制文件) 细节1:文件不存在,创建新文件 细节2:文件以存在,清空文件 |
ab | 追加写入模式(操作二进制文件) 细节1:文件不存在,创建新文件 细节2:文件已存在,清空文件 |
读取
// 打开文件:fopen
FILE *file = fopen("C:\\Users\\Windows\\Pictures\\file\\a.txt", "r");
// fgetc 一次读一个字符,读不到返回 -1
int c;
c = fgetc(file);
printf("%c", c);
// fgets 一次读一行,读不到返回 null
char zi[1024];
char *str;
str = fgets(zi, 1024, file);
printf("%s\n", str);
// fread 读取整个文件,当没有数据读取时,返回 0
char ch[1024];
int n;
// ch 将file中的值传到 ch 数组中; 1 表示每个字符的占用大小;
// 1024 表示读取一行字符的最大长度;file表示文件路径
n = fread(ch, 1, 1024, file);
printf("%d", n);
printf("%s", ch);
// 关闭文件:fclose
写入
FILE *file = fopen("C:\\Users\\Windows\\Pictures\\file\\a.txt", "w");
// fputc 写入字符,写入成功,则返回写入的值
fputc('a', file);
// fputs 写入字符串,写入成功则返回一个非负数
// 如果写入失败,则返回一个EOF的错误(通常为 -1)
fputs("\nHello,世界!", file);
// fwrite 一次写入多个值,返回写入值的个数
// 将数字转成字符
char str[] = {99, 'a', 111, 'k'};
int len = sizeof(str) / sizeof(char);
// str 将str中的值写到 file 文件中; 1 表示每个字符的占用大小;
// 1024 表示读取一行字符的最大长度;file表示文件路径
fwrite(str, 1, len, file);
printf("%d", n1);
ASCII码
1 ~ 10
字符 | ASCII 值(十进制) |
---|---|
'0' | 48 |
'1' | 49 |
'2' | 50 |
'3' | 51 |
'4' | 52 |
'5' | 53 |
'6' | 54 |
'7' | 55 |
'8' | 56 |
'9' | 57 |
a ~ j
字符 | ASCII 值(十进制) |
---|---|
a | 97 |
b | 98 |
c | 99 |
d | 100 |
e | 101 |
f | 102 |
g | 103 |
h | 104 |
i | 105 |
j | 106 |
A ~ G
字符 | ASCII 值(十进制) |
---|---|
A | 65 |
B | 66 |
C | 67 |
D | 68 |
E | 69 |
F | 70 |
G | 71 |
H | 72 |
I | 73 |
J | 74 |
补充
// 读取一个字符
getchar
// 输出一个字符
putchar
// 输入
gets
// feof 是 C 语言标准库中的一个函数
// 如果文件流已经到达文件末尾,feof 函数返回一个非零值(通常为 1)
// 如果文件流尚未到达文件末尾,feof 函数返回 0
ch = feof(fp);
extern
用于声明外部变量,其作用是扩展变量的作用域,可在多个源文件中使用register
用于声明寄存器变量,它的作用是建议编译器将变量存储在寄存器中以提高访问速度,存储类别与变量的作用域无关。auto
是自动变量的存储类别,默认情况下,函数内定义的变量都是自动变量,其作用域仅限于函数内部,属于局部变量,不符合在源文件中所有函数使用的要求。static
修饰的静态全局变量,其作用域仅限于定义它的源文件,其他源文件无法访问,满足只允许在该源文件中所有函数使用的条件。
#define f(x)(x * x);
void main() {
int y;
// 根据宏定义
// 转换得 4 * 4 / 2 + 2 * 2 + 2 = 2
y = f(4) / f(2 + 2);
printf("%d", y); // y = 2
}
算法具有以下五个特性:有穷性、确定性、可行性、输入、输出
程序结构是三种 顺序结构 、选择结构(分支结构)、循环结构
bit是位 是指为0 或者1。byte 是指字节, 一个字节** = **八个位
define PI 3.1415926;
这个写法是错误的,一定不能出现分号
算法: 可以没有输入,但是一定要有输出
计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是它的地址.
1、C语言编写的程序称为源程序,又称为编译单位。
每个C语言程序写完后,都是先编译,后链接,最后运行。c --> .obj --> .exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe
文件才可以运行。
C语言只有八、十、十六进制,没有二进制.但是运行时候,所有的进制都要转换成二进制来进行处理.
1、函数:是具有一定功能的一个程序块,是C语言的基本组成单位. 2、函数不可以嵌套定义。但是可以嵌套调用。 3、函数名缺省返回值类型,默认为 int。 4、C语言由函数组成,但有且仅有一个main函数!是程序运行的开始
7、函数的参数可以是常量,变量,表达式,甚至是函数调用。
传数值的话,形参的变化不会改变实参的变化. 传地址的话,形参的变化就会有可能改变实参的变化。