c

C++1.数据类型

1.第一个代码分析

image-20250601143132639

1.数据类型

定义一个变量或者常量 其实就是开辟了一块不同大小的空间,根据定义的格式来决定空间的大小,然后给这个空间起一个名字,然后在空间里存一个值,如果值的大小超过了空间的大小,就会造成数据的丢失。输出的时候,可以自己定义输出个格式,就是把空间的值给拿出来,然后按照要求来输出,输出的格式跟空间的格式没有关系,因为空间的格式只是为了决定这个空间的大小。

类型大小 (字节)范围/精度
bool1true 或 false
char1-128 到 127 或 0 到 255
signed char1-128 到 127
unsigned char10 到 255
short2-32,768 到 32,767
unsigned short20 到 65,535
int4-2,147,483,648 到 2,147,483,647
unsigned int40 到 4,294,967,295
long4 或 8平台相关
unsigned long4 或 8平台相关
long long8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long long80 到 18,446,744,073,709,551,615
float4约 7 位十进制数字精度
double8约 15 位十进制数字精度
long double8, 12 或 16平台相关,更高精度

1 字节 (Byte, B) = 8 位 (bit)1 KB (Kilobyte) = 1024 B1 MB (Megabyte) = 1024 KB1 GB (Gigabyte) = 1024 MB1 TB (Terabyte) = 1024 GB

1 变量和常量

1.1 关键字

image-20250601144123446

1.2 变量

image-20250601144914872

2.整形和变量的定义和输出

image-20250601150416007

3.整形的输入

image-20250601151424446

scanf 是不安全的,如果不按照要求格式输入就会造成溢出,但是也会接受,但是数据就会丢失部分,所以有可能报错

4. short int long longlong

image-20250601151707319

输出image-20250601152124130

image-20250601170321874

image-20250602145328688

image-20250602150202248

输入

image-20250602151022130

5.字符型

chor 存储是以 ascii 码形式存储

2.关键字 sizeof

image-20250601152348590

3.转义字符

image-20250601162545782

4.浮点数

image-20250601163125470

单精度 4 个字节 双精度 8 个字节

5.类型限定符

image-20250601164757664

image-20250601164807966

2.运算符

1.算数运算符

image-20250602160012552

2.逻辑运算符

image-20250602162200431

3.运算符优先级

image-20250602162250281

多个运算符的时候建议用()括起来,可读性更高 逻辑更清晰

4. 类型转换

image-20250602163607051

5.条件判断 if

image-20250602164446914

6.三目运算符

image-20250602171830597

满足下 x>y 返回 x 否则返回 y

image-20250602172136806

嵌套

7.switch

image-20250603152010680

8.while

image-20250603153457884

9. do while

image-20250603153520959

10.for 循环

image-20250603154118627

11.跳转语句

1.continue

image-20250603155245354

2.break

image-20250603155757321

break 只跳出离它最近的一层循环;break 只能在 switch 和循环中使用

3.goto

image-20250603160627774

12.数组

image-20250603160909416

image-20250603165105360

12.1 一维数组的初始化

image-20250603164806179

image-20250603165455416

12.2 二维数组初始化

image-20250605153520573

image-20250605154013773

image-20250605154237885

12.3 字符数组和字符串的区别

image-20250605155418249

13.字符串的输入输出

image-20250605163734741

image-20250605165115974

fgets 可以指定接受到数据的大小,并且会接收换行的转义字符,如果打印的话 还会进行换行,并别\n 会占一个元素,而且指定接收大小的时候,会少接收一位,因为要自动补一个’\0‘,作为字符串的结束

前两个不安全,超出范围会报错,fgets 超出范围不会报错,但是只会接收规定范围的数据,超出的不接收。

image-20250605171408119

image-20250605171735616

13.1 字符串的拼接

image-20250605172523145

14.函数

14.1 函数的构造

image-20250607183350599

14.2 函数声明 和 exit 函数

image-20250607190513945

14.3 分文件编程

image-20250607191145451

14.4 防止头文件重复包涵

image-20250607191405264

image-20250607191818393

15.指针

image-20250619161037987

15.1 含义

指针本质就是指的是内存地址;

指针变量指的是存储内存地址的变量;

15.2 p 和 *p

![image-20250608163729285](linux.assets/image-20250608163729285.png

image-20250608163812832

15.3 万能指针

image-20250608165834305

15.4 const 修饰的指针

image-20250608171735057

前后都有 const 两个都不能改 p *** p **都不能改

15.5 指针操作数组

image-20250608175658331

16.字符串处理函数

16.1 复制

image-20250610152014687

注意:会覆盖原来的内容

image-20250610152142382

16.2 拼接

image-20250610152829546

image-20250610152844623

16.3 比大小

image-20250610153949553

image-20250610154135873

16.4 按指定格式输出输入

image-20250610154447824

image-20250610154600822

16.5 寻找

image-20250610155410056

image-20250610155443734

16.6 分割

image-20250610160145787

while 循环里 第一次分割需要传首地址,后面传 NULL 就可以

16.7 转型

image-20250610160430531

image-20250610163507232

image-20250610163546908

image-20250610163529270

image-20250610163421125

17.静态变量 static 和全局变量

image-20250611100512543

17.1 全局变量

image-20250611101715496

image-20250611101727604

17.2 全局函数和静态函数

和变量是一样的

image-20250611103639674

18 内存布局

image-20250611110124223

eg:

image-20250611110425778

image-20250611110450114

image-20250611111130896

18.1 内存操作函数

image-20250611113715352

image-20250611113809665

现在版本这个重叠问题已经解决

image-20250611113849132

memmove 就是用来解决 memcpy 的重叠问题的,现在一般不用了

image-20250611113941892

19 结构体

image-20250612144712200

19.1 结构体成员的使用

image-20250612150229833

image-20250612155040765

字符串赋值的时候 如果是初始化结构体时可以直接赋值,以外赋值或者修改都要从 strcpy

eg:

1
2
3
4
5
6
7
8
9
struct Person {
char name[50];
int age;
};

int main() {
struct Person p = {"张三", 25}; // 仅限初始化时使用=
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <string.h>

struct Person {
char name[50];
int age;
};

int main() {
struct Person p;
strcpy(p.name, "张三"); // 正确:将字符串复制到数组中
p.age = 25;
return 0;
}

19.2 结构体和指针

image-20250614143928805

image-20250614144139971

image-20250614144430281

image-20250614150723465

20.共用体 联合体

image-20250614151756694

image-20250614151813150

image-20250614151823223

补充image-20250614152501780

21.枚举

image-20250614153031630

image-20250614153104163

22.typedef

image-20250614155424146

23.文件操作

perror函数是一个用于错误处理的库函数,它的作用是将上一个函数发生错误的原因输出到标准错误输出(stderr)。

1. 概述

image-20250614160856318

2. 文件的打开

image-20250614161545244

image-20250614161722112

image-20250614161917148

image-20250614163026569

3.文件关闭

image-20250614163258804

4.按照字符读写文件

image-20250614164110773

image-20250614164313686

以字节的方式读文件

image-20250615092930541

image-20250615093005824

5.按照行来读写文件

image-20250615094612016

fgets

image-20250615095231061

memset 是为了把 buf 里面的数据清空,防止后面写进去后读操作时读取到旧的数据.

训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main()
{
FILE* fp = NULL;
fp = fopen("a.txt", "w");
if (fp == NULL)
{
perror("fopen");
return -1;
}
srand(time(NULL));
int n = rand() % 10;
char buf[100] = { 0 };
char opt[4] = { '+','-','*','/' };
int a, b;
char ch;
for (int i = 0; i < n; i++)
{
a = rand() % 10;
b = rand() % 10;
ch =opt[ rand() % 4];
sprintf(buf, "%d%c%d=\n", a, ch, b);
puts(buf);
fputs(buf, fp);
}
fclose(fp);
return 0;

}

6.按照格式化 读写文件

image-20250615193317581

读文件

image-20250615193330756

读取的时候,需要用变量来接收

image-20250615194542696

7.按照块读写文件

image-20250616104329562

image-20250616104455168

8.文件的随机读写

image-20250616110448520

image-20250616111638152

9.获取文件信息

image-20250616112629887

image-20250616112703272

将文件的信息保存在一个结构体内

image-20250616112757703

10.删除文件和更改文件名字

image-20250616114405429

c 高级

void

image-20250619142734363

sizeof

image-20250619143317228

image-20250619143638100

image-20250619143929079

指针 堆栈

image-20250619150208022

image-20250619152753799

const 修饰常量

image-20250619164123083

const 修饰的全局常量 直接和间接修改都不能保护,因为是在常量区中

const 修饰的局部变量,不能直接修改 间接可以修改,因为实在栈中,不受保护,是一个伪常量

字符常量

image-20250619164456792

image-20250619164713787

image-20250620110205470

image-20250620110402152

image-20250620111331226

image-20250620111653585

image-20250620111958460

指针

image-20250620112406382image-20250620112449791

image-20250620112613418

image-20250620112721371

image-20250620140442749

字符串指针强化

image

或者设置数组的元素个数多一点,会自动加一个 ‘\0’

image

答案 6 5

strlen 统计的时候不算上‘\0’

image

strof 统计的是整个数组的长度

答案 100 5

image

image

字符串函数

赋值的操作 注释是例子 把 while 里 a=0 改成 1 运行两次看结果来理解这个操作

image

用指针方式实现反转

image

格式化 sprintf

image

image

image

image

image

和 malloc 唯一的区别会自动把内容内容初始化为 0;

image

realloc 是重新分配空间是用的

格式化 sscanf

image

忽略某种类型的字符 遇到空格和 \t 和第一个非该字符 会结束忽略 注:​**常不好用**

image

image

这个也不好用,匹配到第一个非范围内的字符就会停止 可以搭配忽略来用 image

image

image image

匹配到第一个设定的字符就停止

容易出错的点

image

指针偏移后 在释放指针 不会把前面的空间释放了 会报错

这种可以定义一个临时指针指向原指针,代替原指针进行操作,最后释放原指针就行了

image

将局部变量返回并调用,会乱码,因为局部变量在函数结束时就释放掉了

const

image

相关阅读

程序员晚枫专注AI编程培训,小白看完他和图灵社区合作的教程《30讲 · AI编程训练营》就能上手做AI项目。

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!