C语言基础(千锋教育C语言程序设计基础入门视频)

视频课链接:千锋教育新版C语言程序设计基础入门视频,这绝对是C语言教程天花板!_哔哩哔哩_bilibili千锋教育新版C语言程序设计基础入门视频,这绝对是C语言教程天花板!共计158条视频,包括:学习常见问题解惑、01_C语言课程简介、01_VisualStudio软件安装注册_new等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1n34y1k7Y8/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click

一、数据结构C语言基础

1. 基本数据类型

a. 为什么要定义数据类型?

int:4字节,char:1字节,float:4字节,double:8字节

2. 数组

a. 定义20个int,15个char,10个float,并赋值

一维数组 int a [20] = {};

b. 每类数据分别需要三个怎么定义和赋值?

二维数组 int a [3][10]={{},{},{}};

3. 指针

a. 指针的定义与赋值

int* p;

int x =12;

int* p=&x;

b. 如何取指针变量里面的值

int y=7;

int* q=&y;

printf("%d",*q);

c. 指针与一维数组

a2c0a788b79e5a1800da86e205286ed4.png

4. 结构体

a. 结构体定义方式

91723226eaaff03c6e2e70f1f6757efa.png

b. 定义单链表

c48636bb097f3f6eb0352abd1ae009b0.png

5. malloc

申请堆区空间,可修改

da6affe4d5c36ff13bf15a95a3efb311.png

093195b93e0956f28f1511b1218ce4b6.png

6. 输出printf()

int x =6;

float y =6.3;

char z ='&';

printf("%d",x); //输出整数

printf("%f",y); //输出浮点数

printf("%c",z); //输出char

19586324989d1bd9cb46670d7a193db9.png

7. 输入scanf()

scanf("%d,%f,%c",&x,&y,&z);

scanf_s();//输入char、int的时候与scanf区别不大,在输入字符串的时候,要限定输入元素的大小值,避免引用到不存在的元素。

8. 运算符

算术运算符中,%取余,/取商

条件运算符中,表达式1?表达式2:表达式3;(判断1,真则执行2,非真则执行3)

二、C语言程序设计(补充)

(1)基础知识

1. 原码反码补码

252f768151f49566f5660250f1bdce6c.png

2. 堆(动态存储区)栈

609ae637ff2a9b80796a164c42de029a.png

3. C语言编译过程(预编译、编译、汇编、链接)

a.

dc8d5ff85ab2e7a507e312d0c2697f71.png

.o 二进制代码文件

b. Linux下GCC编译器编译过程

efd9a290ee57ecc38aae8e332c53d9b9.png

hello_elf 为目标文件名

(2)定义宏、编译

1. define定义宏

a. 不带参的宏

b828db1d398f7bba0c2daec20e80c2ef.png

a173cfdde64518831b9a9637f11b385c.png

b. 带参的宏

4e51ca31fb9dab13db536c312a17a2b2.png

55757f418a0b945e547704a4cc1c6961.png

2. 选择性编译

选择性编译都是在预编译阶段完成的

a. #ifdef

5ba5e7a45c7c2ff8f4cd673a0effdedd.png

b. #ifndef

a6d6c1c78d0f56fb11a8b4517195fd27.png

c. #if

a037ed62eeb9d07b4962c938391e3227.png

3. 静态库和动态库(linux中gcc编译器)

a. 动态编译和静态编译

fce9852b4bb2ff63fd2e2c2fe921d7cc.png

b. 静态库文件的制作

cbc74807a5fc389bae4795b94d297521.png

57c755d5bbe3f9ed9f6b7d793134bb63.png

a415a74a2ed0b621e0c0bcce28a698e4.png

c. 动态库文件的制作

668f7d390d24b2268be12abbdc202a2c.png

(3)指针、字符串、结构体、共用体等

1. 指针与内存

a. 指针的概念

c5225d796530b944fa2314da368d13d2.png

644984c8679dd4686113adefddbd9d75.png

多字节变量int a 的地址为0x00002000(最小的地址)

20da84f4e323de58a758a1b8be5b5731.png

b. 指针的定义(&取地址,*取值)

5b94ff082f0e6b350756dec137917b8a.png

int *p,*q; //定义了两个整型指针变量

int *p,q; //定义了一个整型指针变量p和一个整型变量q

c. 指针的分类

0914ea9d083d86eec1b641d819d19041.png

补充:C语言中规定,数组的名字就是数组的首地址,即地0个元素的地址,就是&a[0],是个常量。

不能给常量a赋值,可以给指针赋值。

d. 指针的运算

ⅰ. 指针指向数组中的一个元素时,加一个整数n,将指向下第n个元素。

ccdc2097fb5392f027920033618cad69.png

ⅱ. 同类型指向同一个数组元素的指针可以比较大小、做减法(中间隔了几个元素)、赋值

d558ec397b9305dd81f4ab52e9b0c650.png

e. 指针的指针

017c4bf6522027ff0011c0e0e5ad5a25.png

2. 字符串(#pragma warning(disable:4996))

括号中内容可屏蔽visual studio中对scanf等函数的不安全警告

a. 字符串的可修改性

c15dd8ece518ccbbc6b277e506c77b7e.png

b. 字符串的初始化及赋值

7939c1d3563ecff8b151ed8d2c98c1cf.png

43e4709d0a0837807db0770851cb1610.png

3. 数组的指针(与指针的数组区分)

a. 数组指针的定义

24d41693c675e29576769215cd01d976.png

b. 数组名字取地址

c9796ecf4c228292ca18ab42cab9c078.png

c. 数组指针取星号(*)

71b342240fa12dea8635fddcce8ff895.png

4. 指针作为函数的返回值

5f767ce774c7d0d18d4aab82be3e99b5.png

a. 函数执行后str被释放,p为野指针,此种情况无意义

fe1d762e147a8e065a37afc3779464eb.png

第四行改为
①Static char str[100] = "hello world";//静态局部变量

②char* str = "hello world";//文字常量

③char* str;

str = (char*)malloc(100);

strcpy(str,100,"hello world");//堆区内容

皆可。

5. 函数指针

0792a300e73da2e3d04581f5ab050bf8.png

21e13aaeb563654cb94bc8db05c31961.png

a. 调用方法

76de62a93993d193fe30d698ad4a51b1.png

同理可以写函数指针数组int (*p[5])(int,int);

6. 特殊指针

void *q 通用指针q

NULL 空指针

ceca418a92dc15112813d4c15abf8c67.png

7. 主函数传参

160e7ad98d88cf3fe434b0c133b22014.png

ce205fb188bca25457321cb43bf028e9.png

8. 动态内存申请

a. 动态内存分配的概念

d071134739a120f3e8f090b369c463aa.png

b. 静态分配、动态分配

125cc0386cad94a85a41c46beead6ecd.png

c. 动态分配函数

ⅰ. malloc();

cf95fde8aa2a9d3f46391434df56ecd5.png

char* p;

p = (char*)malloc(20);

8124e9bd880d5d58cde72057be0ee53b.png

ⅱ. free();

e6edc823c0529fa24d07c853d72bd39c.png

free之后一般使p=NULL;

ⅲ. calloc();

3bdb31f8c3bdf1515526f6d11c8369d3.png

252727c928694ce374221adcd854a25a.png

e8222424520d4aeeb4faa18708cb8461.png

ⅳ. realloc();//重新申请内存

9dd334f1c6609c16c6553dcfd994f46f.png

8b340e05c024e57c02bd8827cc64eb78.png

d. 内存泄漏

不断消耗内存,内存用尽后,程序会崩溃。

可能会存在的问题:

ff5ce86914513879259f7b10727a3b15.png

72d4bdd1b8f5a761b910ef769501a72f.png

解决方案1:

e0d2817deb39076cc97e8657e3d299ea.png

解决方案2:

7c6938b04fe1dd435bb885ee29a4b87a.png

8bae9090a44ca29ab98cd4ac25e8b8d5.png

9. 字符串处理函数(包含头文件<string.h>)

1930c1b70748a6f3eb4ecd8d8a6cab06.png

linux不需要屏蔽警告

a. 测字符串长度strlen();

size_t为头文件中使用typedef定义的整数。

4ca5fc1c0eebd8fe25e8dbd73e19a41a.png

sizeof是测占用多少字节。

fa3f0ce6f522f5ee3a19fb6efa41e5c3.png

b. 字符串拷贝函数*strcpy();

9fc2aae5946bd1795fd41895e3fa6012.png

3695051278856e476b5f3a963ae655b5.png

c. *strncpy();

9d614b03ef5f379d521cbb7806d22165.png

2、如果n大鱼src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个“\0”。

拷贝n个字节不包括"\0"。

14a369112adc05df2d4311cec473c286.png

d. 字符串追加函数*strcat();

d47123f02927ab87493ba299fc4a8c92.png

e. *strncat();

58866f3c273d8517061816ff585eb57b.png

f. 字符串比较函数strcmp();

a24ebe78b026f6be60fd08ed7c529b1a.png

g. strncmp();

2da4efae2e7bd47bdd69917b7da22471.png

h. 字符查找函数*strchr();//首次匹配

2c3540e5a895caa08b91979fe1342c9e.png

找到的是第一个字符的地址返回值

i. *strrchr(); //末次匹配

609d2c70788e18df10bfa865cdb16e2d.png

j. *strstr();//首次匹配

ecccca41f34046f612e6a849256e4521.png

k. 空间设定函数*memset();(通常用于内存初始化)

7cccfe0db3a0ee3517a1ecb56963d697.png

l. 字符串切割函数*strtok();

7e538f5f977c371ea0303ee35398763b.png

10. 字符串转换数值(包含头文件<stdlib.h>)

a. 字符串转换数值(atoi整型,atol长整型,atof浮点数)

3c992e1964abc4df550f0f83f1a8a5dd.png

11. 格式化字符串操作函数

a. sprintf();

在网络数据组包、解包常见

c2b0123049391298bae02138e54feacc.png

b. sscanf();

ⅰ. 基本用法

1fa7373677c24ea1f58a0580767de197.png

ⅱ. 跳过数据

941445c6dc9ebe393c41463a3110699c.png

ⅲ. 指定宽度

0bb035d261c7938779df04f12443058f.png

ⅳ. 集合操作(匹配指定ASCII范围)

68ffe965dd56516b1ad8a6c7f25d2ec4.png

6dd043a9c0f17c8ad645e5a0255b1cf8.png

4d971fe1cc707bb7ffaebb1745588033.png

12. 只读关键字const

a. 修饰普通变量

8a7348d79bd0ac6590374ce27e55b009.png

b. 修饰指针

387760cf18e599c752b4097cc0a3d942.png

87e091c5711c0d74c9c93ff507aa7640.png

13. 结构体struct

a. 结构体定义

ⅰ. 先定义类型,后定义变量

c4719008cdc4e87ab8cc48199a9dd56b.png

bf9ab215bd556d31dd2952cec6f4437e.png

ⅱ. 定义类型,顺便定义变量

4d9e8f9b2c66016fa2b43d1c79bfc1fa.png

996dcb658ae81c44fda048144dfc5dec.png

ⅲ. 没有类型名的结构体

2a711a82fd1f3f2b05bb5c0e51947da4.png

ⅳ. 最常用的方法

df2be5dbe953772822c513c64cfd2d6b.png

d686b065f6eeb1374f28eb69306fb230.png

b. 结构体变量的定义初始化及使用

ⅰ. 按顺序连续初始化(下例中,可以只初始化前两个,但不能只初始化第一个和第三个属性)

8dce976b5c73fbaeab97749f77b0459b.png

ⅱ. 结构体变量成员的引用

2529498e4fc239b4fde9f7b2a389a4fc.png

ⅲ. 结构体成员多级引用(子类父类)

add97d329fe3e9555a2d0bfd8de68b14.png

c. 结构体变量相互赋值

0d582e0317f65f7339fef1ddd4996034.png

d. 结构体数组

f9684bae6bb2584651aced771c759a04.png

4b5168ab2d470c9821fe40552e6513d8.png

e. 结构体指针

ⅰ. 变量定义、访问变量成员

bb79c32980fb6bd7e3e31dab6661dbd1.png

3dcc01bd75ca9baf236cc5a4873d449c.png

ⅱ. 应用场景——保存结构体变量的地址

e97c1c1f9ccd38ebb8047e77f71d6882.png

ⅲ. 应用场景——传结构体变量的地址

5b96ca96f3cb9d8427c4c070e241a4d8.png

84a5627b6e56940065b7cfe06d954f3d.png

ⅳ. 应用场景——传结构体数组的地址

对照“结构体数组”及“传结构体变量的地址”的内容推导

ⅴ. 结构体变量地址的注意事项(有关指针类型和地址)

boy的指针为STU *,boy.num的指针为int *,它们类型不相同,但指向同一地址

16cf982dcbaa306fd9b303490f2600f4.png

ⅵ. 结构体数组地址的注意事项(与上一注意事项类似)

dcdd31324ec5a87d7d2c5c752703c825.png

f. 结构体内存分配

ⅰ. 基本概念

Q:char和int加起来才5个字节,为什么分配八个字节内容?

A:在32位系统中,4字节寻址,按此规则分配加快存取速度。

2ee12e939caafbeb5172d3635828ce69.png

ⅱ. 规则1:以多少个字节为单位开辟内存

177b6983a76e7ee8361795ce1a738de8.png

4edcf5ace9806682f6109b95b4f42fdb.png

ⅲ. 规则2:字节对齐(目的是空间换时间,提高CPU读取效率)

a7131aafc1fc31226d2b6e00454defd6.png

ⅳ. 指定对齐原则

63a72554548e4b082987f7e4717f4e54.png

此处开辟(2+2*2)字节内存,如下图

35909d3f35465e6d0334f8e8a5543114.png

g. 位段(位域)——不能对位段成员取地址

8位一个字节,下面图中空出的16位是因为是四字节对齐。

a8c083e3bda826857a4407f849eac888.png

46cf1ab5d28451638b0970daa46479af.png

ef56f6cf2a00cd421aadfcefb5591e3d.png

9e2752b9ca5b1876c29a00aa06b80a7b.png

5086c17848df324d22b51699780cd30d.png

14. 共用体union

ⅰ. 共用体的概念

21956b38e9f5ba49e7900d7745444786.png

6560adbfa35b1c98f6cf5052c95bdc3e.png

73101f7f8ff6fde271628d5b9e652a57.png

ⅱ. 共用体的特点

add4b5a07b98b557fde654b894bf7032.png

7e4a46fabb58cb91000032b13a042c35.png

15. 枚举enum

ⅰ. 定义方法

ae1eb20d31179d1cce264ffd6642d63c.png

ff3202abb845d9a3373295a95304ebff.png

4c0f50efe823edec805bcc6bec0f54db.png

f251a5b953f0fc16594a785ad30d8264.png

16. 文件

a. 标准io库对磁盘文件的读取特点

9b338da0ecf33063dd6a2428d08bbd2a.png

77fbbc1716a20894af12cc9e1c861b29.png

b. 文件指针

be8f2cc69221d0a6acf6fc3b05c27c7a.png

46bfc4827c1081d2d2d2283e2ce36e0c.png

c. 打开文件

34752a304ae656423e2ce85c98803482.png

dcddd114b3377b214a1be9f65d6d326e.png

4173fe8f7a3992175c0144121739fa3c.png

05df0224c403ee66d3b3b632ef0a5d8f.png

rb:作为二进制文件以只读方式打开

0ed0eff1a788c70fa0626acde18bd2ef.png

d. 关闭文件

73be1a9b2827794bb2b4d4d112392aab.png

e. 一次读写一个字符

f9b94c429ccd665fbdb024ac6dd95e26.png

af079d9dc906d443a3985aac2ee1e71d.png

e9fa961f9dba9e60dcaa614d87167825.png

perror报错

stdout是设备文件,相当于屏幕

f. 一次读写一个字符串

eb4b6494dcde38b7b0b0c2dee49a5f0d.png

5b6ac9c71ffff1adaceca0800f6b4daa.png

g. 读文件、写文件

ⅰ. fread()

ed96b254339b3d23c2a705fd9444074e.png

6685a86fa313a0f662cef06d76b009f9.png

ⅱ. fwrite()

f7cc7b34c26739f196b4554217396b5f.png

h. 随机读写

ⅰ. 概念

7ed58109c6bdcde36e55284666ec13cd.png

ⅱ. rewind()

523f6f8a74ea0187e936fd3a07f27d8a.png

aa70bd213d8a3f9c871fb010e6fb8092.png

ⅲ. retell()

a53bfa8e0b18dde55cb3647f35df6541.png

ⅳ. fseek()

347848fa9856906ea4d3a1c2628844cc.png

6cbd9245fb4d91ebcd48863b15770390.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WISHMELUCK1'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值