![](https://img-blog.csdnimg.cn/fa56f4b2b1c74d4b8daf9f5b1e655d37.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言详解
文章平均质量分 81
详细介绍C语言,从初阶到进阶
核动力C++选手
优秀的猎手要耐心等待机会!
展开
-
C语言实现通讯录
相信大家对通讯录很熟悉,通讯录在我们日常生活中经常被用到,比如我们手机联系人通讯录,微信通讯录等,那通讯录可以用C语言来实现吗?!在实现通讯录时,我们主要用到的知识有结构体、指针、动态内存开辟,文件操作等方面的知识。经过通讯录这样一个小实战项目的练习,相信大家一定会对C语言的知识理解地更加深刻,那么接下来,让我们对如何用C语言实现通讯录一探究竟吧~原创 2023-10-03 15:17:13 · 204 阅读 · 1 评论 -
程序环境和预处理
语法:#define reg register //为 register这个关键字,创建一个简短的名字;) //用更形象的符号来替换一种实现case //在写case语句的时候自动把 break写上// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。在define定义标识符的时候,要不要在最后加上;?比如:建议不要加上;,这样容易导致问题。max = MAX;会出现语法错误。原创 2023-10-02 20:50:15 · 186 阅读 · 6 评论 -
C语言文件操作
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。原创 2023-09-30 10:38:07 · 193 阅读 · 12 评论 -
C语言指针进阶(3)
第一个:p为结构体类型的指针,p+1跳过一个结构体类型,结构体大小是20个字节,所以0x100000+20 == 0x100014。2.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。&p[4][2] - &a[4][2]:指针-指针计算的是指针之间元素的个数(-4):这道题数组初始化的时候是( ,),这是逗号表达式(0,1)的结果是1,以此类推。3.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。//以%d形式打印出来的是补码,因此是-4。原创 2023-08-31 11:14:02 · 153 阅读 · 4 评论 -
动态内存管理(2)
所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。当出来Getmemory()函数后,创建的p[ ]被销毁,这样返回的地址赋值给str,str就成为野指针了,此时对str指向的空间的访问属于非法访问。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。原创 2023-09-15 18:40:05 · 175 阅读 · 9 评论 -
动态内存管理(1)
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。1.如果开辟成功,则返回一个指向开辟好空间的指针。2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。free函数用来释放动态开辟的内存。原创 2023-09-10 12:25:04 · 189 阅读 · 5 评论 -
自定义类型:结构体、枚举、联合
有了结构体类型,那如何定义变量,其实很简单。int data;int data;}Node;int x;int y;}p1;int data;//结构体嵌套初始化//结构体嵌套初始化位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。int _b : 5;原创 2023-09-03 16:24:02 · 323 阅读 · 3 评论 -
字符函数和字符串函数(2)
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。3.如果source和destination有任何的重叠,复制的结果都是未定义的。2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。memcpy是内存拷贝,拷贝字符串、整形数组、结构体数据。2.这个函数在遇到 '\0' 的时候并不会停下来。1.函数memcpy从source的位置开始向后。比较从ptr1和ptr2指针开始的num个字节。的数据到destination的内存位置。返回值和strcmp相似。原创 2023-09-01 19:50:42 · 663 阅读 · 0 评论 -
字符函数和字符串函数(1)
1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。2.参数指向的字符串必须要以 '\0' 结束。3.注意函数的返回值为size_t,是无符号的( 易错 )4.学会strlen函数的模拟实现为了说明3,举个例子:这里输出大于看起来很奇怪,原因就在于strlen的返回值是size_t类型,是无符号数,因此,-3在内存中的原码被当做无符号数,emmm//-3。原创 2023-08-31 20:48:19 · 166 阅读 · 5 评论 -
C语言指针进阶(2)
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。parr1先和[ ]结合,说明parr1是数组,数组的内容什么呢?因为目前还没有学习快速排序算法,所以我们使用冒泡排序的思想,实现一个功能类似qsort的函数。那么,函数指针数组:数组的每个元素是函数指针类型。指针指向一个数组 ,数组的元素都是函数指针;1.使用冒泡排序的思想。原创 2023-08-28 17:21:19 · 78 阅读 · 0 评论 -
C语言指针详解
指针~原创 2023-07-29 19:37:59 · 73 阅读 · 0 评论 -
【C语言操作符详解(1)】
sizeof 是在计算类型创建变量或者变量的大小,单位是字节sizeof 计算的结果是size_t 类型的size_t 是无符号整型的对size_t 类型的数据进行打印,可以使用%zdsizeof 后面的括号在括号中写的不是类型的时候,括号可以省略,这样就说sizeof不是函数sizeof是操作符 - 单目操作符int main()2);0);a = -a;p = &a;//这样写行不行?//这样写行不行?return 0;原创 2023-07-28 10:09:41 · 109 阅读 · 3 评论 -
【C语言操作符详解(2)】
目录条件操作符--唯一一个三目操作符逗号表达式 下标引用、函数调用和结构成员[ ]下标引用操作符 ( ) 函数调用操作符 访问一个结构的成员 表达式求值 隐式类型转换 算术转换 操作符的属性 表达式求值 隐式类型转换 例1: 例2: a,b要进行整形提升,但是c不需要整形提升。a,b整形提升之后,变成了负数,所以表达式a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表达式c==0xb6000000 的结果是真. 例3:原创 2023-07-29 07:52:29 · 58 阅读 · 0 评论 -
编程之旅~
大家好,我目前是一自我名985硕士在读(研0),专业是控制科学与工程,经过咨询师兄师姐,由于我们这个专业和计算机专业有一些公共的课,所以大家毕业很多人去了互联网公司。我的想法也是毕业后进入一家互联网公司,所以想早点开始为找工作做准备。另外。由于研究生阶段还有科研任务,所以更要早点准备,在研2秋招是拿到一个满意的offer。原创 2023-07-30 19:40:55 · 55 阅读 · 1 评论 -
C语言结构体详解
有了结构体类型,那如何定义变量,其实很简单。原创 2023-07-31 13:53:58 · 53 阅读 · 0 评论 -
C语言中0、‘0’、‘\0’、EOF的区别
3. '\0' - 其实是'\ddd' - 一般作为字符串的结束标志,数值是0。2. ‘0’ - 字符0 - 字符0的ASCII值是48 - 数值是48。1. 0 - 数字0 - 数值就是0。原创 2023-08-01 20:25:55 · 659 阅读 · 0 评论 -
C语言深度剖析数据在内存中的存储
前面我们已经学习了基本的内置类型:char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点数double //双精度浮点数以及他们所占存储空间的大小。1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。2. 如何看待内存空间的视角。什么是大端小端大端字节序存储模式,把一个字节的低位字节处存放在内存的高地址处,高位字节处的数据存放在内存的低地址处。小端字节序存储模式。原创 2023-08-02 20:35:59 · 95 阅读 · 2 评论 -
C语言实用调试技巧
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。上述代码在Debug环境的结果展示:上述代码在Release环境的结果展示:Debug和Release反汇编展示对比:所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。原创 2023-08-01 19:15:35 · 50 阅读 · 1 评论 -
C语言函数详解(2)
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。3. 函数的声明一般要放在头文件中的。函数的定义是指函数的具体实现,交待函数的功能实现。test.h文件放置函数的声明test.c文件放置函数的实现未来工程中,代码是比较多的,函数一般是放在.h文件中声明,.c文件中实现的!为什么要将代码拆成.c .h的文件呢?可能主要出于以下两点考虑:1.多人协作2.代码保护。原创 2023-08-11 10:54:07 · 71 阅读 · 0 评论 -
C语言函数详解(1)
如果库函数能干所有的事情,那还要程序员干什么?所有更加重要的是自定义函数。自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。函数的组成:statement;//语句项ret_type 返回类型fun_name 函数名para1 函数参数下面我们看一个例子:写一个函数可以找出两个整数中的最大值。x : y;原创 2023-08-10 12:24:20 · 286 阅读 · 2 评论 -
C语言数组详解
C语言数组原创 2023-08-12 10:13:16 · 173 阅读 · 2 评论 -
分支和循环语句(2)(C语言)
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。补充:比较字符串时,不能直接用 == 比较,strcmp函数是比较字符串的大小的,头文件是string.h。break都是用于终止循环,continue是跳过本次循环后边的代码,直接去判断部分。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。循环至少执行一次,使用的场景有限,所以不是经常使用。这种方法效率很高,但条件苛刻,需要数组有序。原创 2023-08-09 11:12:37 · 384 阅读 · 0 评论 -
分支和循环语句(1)(C语言)
C语句可分为以下五类:1. 表达式语句2. 函数调用语句3. 控制语句4. 复合语句5. 空语句本文后面介绍的是控制语句。控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句,可分为以下三类:1. 条件判断语句也叫分支语句:if语句、switch语句;2. 循环执行语句:do while语句、while语句、for语句;3. 转向语句:break语句、goto语句、continue语句、return语句。原创 2023-08-07 10:41:24 · 45 阅读 · 0 评论 -
C语言指针进阶(1)
数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针 - 指向整形的指针字符指针 - 指向字符的指针浮点型指针 - 指向浮点型的指针数组指针 - 指向数组的指针!那数组指针应该是:能够指向数组的指针。下面代码哪个是数组指针?//p1, p2分别是什么?解释://解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。原创 2023-08-07 16:46:11 · 53 阅读 · 1 评论