![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 76
吾爱技术圈
这个作者很懒,什么都没留下…
展开
-
C语言不踩坑:有符号数与无符号数相比较
1.不要把有符号和无符号数进行比较2.当比较符号的一边有减法运算式时注意有无可能运算结果为负数3.注意无符号的使用,因为在unsigned的世界里,x-y>0与x>y是不等价的。原创 2024-05-28 09:20:49 · 956 阅读 · 0 评论 -
关于函数和变量命名
标识符是指用来识别某个实体的一个符号,在不同的应用环境下有不同的含义。在计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。C语言的标识符一般应遵循如下的命名规则:1、标识符必须以字母a~z、A~Z或下划线开头,后面可跟任意个(可为0)字符,这些字符可以是字母、下划线和数字,其他字符不允许出现在标识符中。2、标识符区分大小写字母。3、标识符的长度,c89规定31个字符以内,c99规定63个字符以内。原创 2023-06-28 17:18:59 · 657 阅读 · 0 评论 -
C语言#if,#ifdef,#ifndef条件编译用法汇总
条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。最常见的条件编译是防止重复包含头文件的宏,原创 2023-05-29 14:30:12 · 13211 阅读 · 0 评论 -
C语言常见面试题汇总
为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。一个整型数 int a;一个指向整型数的指针 int *a;一个指向指针的指针,它指向的指针是指向一个整型数 int **a;一个有10个整型数的数组 int a[10];一个有10指针的数组,该指针是指向一个整型数 int *a[10];原创 2023-04-03 20:38:03 · 12886 阅读 · 2 评论 -
C语言不踩坑: 自动类型转换规则
首先我们要知道加法的计算机底层逻辑其实是按位相加,得到的结果数同样的内存数据,翻译成有符号数和无符号数都可以,a+b的结果-5从内存里看,与一个很大的无符号数的内存数据是一样的,前面判断(a+b)>0时,是按-5的内存数据无符号状态去和0比,后面打印结果时,用的是%d打印的是按有符号数据输出,即使a+b的结果是一个很大的无符号数,但按有符号看待的话结果就出来-5。这时因为有个自动转换的规则:有符号整型和无符号整型混合运算时,有符号型自动转换成无符号型,运算的结果是无符号的。原创 2023-03-04 17:13:27 · 1089 阅读 · 2 评论 -
C语言又一活久见操作: 初始化结构体数组时对结构体元素的成员赋初值
最近在某项目代码中看到一段代码,是在定义结构体数组时对数组中的元素进行赋值。根据前面定义结构体数组赋初值的例子,我又想到会不会普通数组也可以这样?原创 2023-02-19 23:57:37 · 561 阅读 · 0 评论 -
C语言运算符优先级和结合性一览表
目”就是“眼睛”的意思,一个运算符需要几个数就叫“几目”。6、此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符()和逗号运算符。3、另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是所有单目运算符,一个是三目运算符。> 算术运算符 > 关系运算符 > && > || > 赋值运算符。2、所有双目运算符中只有赋值运算符的结合方向是从右往左。原创 2023-02-19 17:09:27 · 984 阅读 · 0 评论 -
C语言 常用标准库函数代码实现
memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;dest表示拷贝到哪个目标,src表示拷贝源,加const修饰,防止被修改,n表示拷贝多少个字节返回void* 类型的原因,是为了使用链式表达,即strlen((char*)(memcpy(dest,src,n)),这样可以直接计算dest的长度,使程序代码更简洁。原创 2022-12-16 17:43:52 · 1514 阅读 · 1 评论 -
C语言 结构体定义方法
也可以将下面这段定义写在头文件中,供每个包含该头文件的源文件使用,定时变量的时候structstudentstu1即可,大部分人可能会觉得student_t比structstudent看起来更加简便。一般不使用这种方法,因为直接定义结构体变量stu1、stu2之后,就不能再继续定义该类型的变量。是最基本最标准的结构体定义,即先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量(有结构体名)。先定义结构体类型,再定义结构体变量(无结构体名)。下面归纳几种定义结构体变量的方法。...原创 2022-07-23 17:35:23 · 12709 阅读 · 0 评论 -
C语言 0长度数组/柔性数组
零长度数组就是长度为0的数组。ANSIC标准规定定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的。在ANSIC中定义一个数组的方法如下类型数组名[数组元素个数];例如C99新标准规定可以定义一个变长数组。C语言的变长数组)intlen;也就是说,数组的长度在编译时是未确定的,在程序运行的时候才确定,甚至可以由用户指定大小。比如,我们可以定义一个数组,然后在程序运行时才指定这个数组的大小,还可以通过输入数据来初始化数组。.........原创 2022-07-22 17:52:45 · 2039 阅读 · 0 评论 -
C语言的变长数组
在C99标准之前的C89,C90,如果一个数组大小是变量定义,则在程序运行前不能确定数组大小,也就无法申请,故不允许。因此,程序在离开变长数组定义所在的块、函数时,变长数组占用的内存空间会被自动释放,不必使用free()。变长数组中的“变”不是指可以修改已创建数组的大小,一旦创建了变长数组,它的大小则保持不变。这里的“变”指的是在创建数组时,可以使用变量指定数组的长度。而const修饰符在星号之后,则表示指针在被声明后指向内容可以变,指向地点不能变,即只能指向这个获取的空间,完全符合数组的性质。......原创 2022-07-15 17:37:49 · 13628 阅读 · 0 评论 -
一个结构体 = 另一个结构体(同类型结构体之间可直接赋值操作)
两个同类型结构体变量可以直接赋值,不同类型结构体不能直接赋值。原创 2022-07-01 17:50:04 · 16404 阅读 · 7 评论 -
C语言 void和void *(无类型指针)
void 关键字void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a; 这行语句编译时会出错,提示“illegal use of type ‘void’”。不过,即使void a的编译不会出错,它也没有任何实际意义。void真正发挥的作用在于:对函数返回的限定当函数不需要返回值时,必须使用void限定。例如: void func(in原创 2021-07-26 19:30:50 · 1013 阅读 · 6 评论 -
C语言 内联函数
【注:本文只讨论C语言中的内联函数,暂不谈论C++,因为C++中这块知识相对要更复杂。】什么是内联函数在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。内联函数是代码被插入到调用者代码处的函数。内联函数通过避免被调用的开销来提高执行效率。采用内联函数实质是以空间换时间的做法举例:void myprintf(int a){ printf(“%d”,a);}int main()原创 2021-07-22 19:26:30 · 5255 阅读 · 4 评论 -
C语言 十六进制整数字符串转十进制整数
【问题描述】 从键盘输入一个不超过0xFFFFFFFF的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入FFFF样例输出65535【解决方案】方案1:使用C标准库strtol函数。在这里插入代码片...原创 2021-07-09 17:06:23 · 11352 阅读 · 0 评论 -
C语言 计算结构体大小
前言数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。如何计算结构体大小以下面这个结构体为例:struct S{ double d; char c; int i;};使用 sizeof(struct S) 计算其大小发现结果是16,并不是doubl转载 2021-06-18 15:09:22 · 7714 阅读 · 8 评论 -
C语言浮点数据在内存中的存储方式
float在内存中的存储遵循IEEE 754标准。在C/C++中,float类型占4个字节即32位 , 这32位分成了3部分:符号位最为简单,如果你存储的是正数那么符号数就是0。如果是负数,则为1。下面,我以13.625为例说明阶码与尾数的表示方法。首先,我们取出13.625的整数部为13。对其使用短除法(对该数除以2,直至不能再除的一种方法)结果如下将各余数自下而上排列,则得到了13的二进制表示。之后,取出13.625的小数部分为0.625对其每次乘2取出整数留下小数,直至得到1。结果如下自原创 2021-06-16 16:49:31 · 578 阅读 · 0 评论 -
C语言 位域的使用
目录什么是位域位域的定义位域的使用使用位域的注意点(重要)实际应用什么是位域有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。典型的应用场原创 2021-06-15 14:54:44 · 3743 阅读 · 5 评论 -
do{...}while(0);写法用途详解
在一些项目代码中,有时会遇到这样的代码:do{ ...}while(0);我当时的反应大概是这样的实在是有点无解这种写法,说实话的确没看出来有什么用,这跟不加这个有什么不同吗?经查询资料才发现,这种写法大有用处,看了各路大神的总结,我恍然大悟。在此主要是整理记录下来,方便查看。也希望对读者有帮助,谢谢!...原创 2021-05-22 00:00:50 · 588 阅读 · 0 评论 -
VC2019编译报错 error C4996: This function or variable may be unsafe
【问题描述】使用新安装的VS2019编译C代码保报错error C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.但程序是没问题的,放到VC++6.0上可以正常编译。【问题解决】1、菜单选择项目-》属性原创 2021-04-28 15:51:21 · 350 阅读 · 0 评论 -
C语言 十进制整数字符串转十六进制字符串
【问题描述】例如:输入str1[]=“87632394”,需转成str2[]=“5392A0A”【解决方案】方案1:先使用strtol函数将字符串转成十进制数,再通过sprintf函数将十进制数按十六进制字符串形式输出到字符数组保存该方案弊端:转换的数不能大于0x7FFFFFFF,因为strtol的返回值是long型#include <stdio.h>#include <string.h>#include <stdlib.h>int main(void原创 2021-04-28 14:17:41 · 7018 阅读 · 0 评论 -
Visual Studio安装教程
本文章主要记录Visual Studio2019的安装过程,由于只用于开发C/C++,因此关于其它语言支持将不安装,仅供参考。一、下载1.下载地址在微软官网:微软官网2.选择菜单栏最右边的更多,在“所有 Microsoft”下拉一栏选择“Visual Studio”进入3.进入之后是这个界面,选择社区版Community下载(社区版Community是对个人免费的,一共有三个版本),这里下载的不是整个安装包,因此比较小,很快就能下完。二、安装1.点击下载程序,会显示这个界面2.点击“继原创 2021-03-01 20:56:21 · 22310 阅读 · 0 评论 -
Visual Studio 如何创建C/C++项目
这里不说Visual Studio安装过程,默认已经安装好软件。1. 打开软件Visual Studio,点击创建新项目2.语言选择C++,平台选择Windows (此步骤可跳过)3.选择空项目,点击下一步4.填写项目名称,选择项目文件路径,可勾选“将解决方案和项目放在同一目录中”,点击创建5.创建成功后,看到界面右侧资源管理器栏展示了项目结构,右键源文件,点击“添加–>新建项”,改文件名(我这里是main.c),点击添加,完成后会自动打开该创建文件的编辑界面6.上一步创建了原创 2021-02-26 14:52:05 · 22819 阅读 · 2 评论 -
C语言string.h文件函数汇总详解
注:下列例程执行结果由VC++6.0环境编译运行。目录一、常用函数1.strcpy2.strncpy3.strstr4.strcmp5.strncmp6.strchr7.strlen8.strcat9.strncat10.memcpy11.memset12.memcmp二、非常用函数1.strnset2.strset3.strtok4.strupr5.strlwr6.strrchr7.strtol8.strtod9.strrev10.待续一、常用函数1.strcpy函数原型:char *strcpy原创 2021-02-09 22:43:08 · 1401 阅读 · 0 评论 -
详解C语言中 # 和 ## 的用法
一句话总结功能:使用#把宏参数变为一个字符串,用##把两个宏参数粘连到一起##用来连接前后两个参数,拼接符号。可以是符号拼符号,可以是数字拼符号,可以是数字拼数字#用来对后面的宏参数进行字符串化操作,简单来说就是相当于在宏变量的两边各加上一个双引号使其变成一个字符串注意,##和#只可用在宏定义中,这只是给编译器看的。(语句体中不可直接用##和#)功能总结很简单,但实际应用方式却多种多样,可谓非常强大。一、基础应用:例1:使用 # ,把一个宏参数变成对应的字符串#include<stdi原创 2021-02-03 15:46:23 · 10301 阅读 · 2 评论 -
STM32的大小端模式——什么是大小端模式?
目录什么是大小端模式为什么会有大小端模式之分什么情况需要考虑大小端模式常见的设备的大小端模式测试大小端模式例程什么是大小端模式大端模式Big-Endian:高字节存于内存低地址,低字节存于内存高地址。小端模式Little-Endian:低字节存于内存低地址,高字节存于内存高地址。网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。首先我们来看下数据在大小端两种模式下存储图,假设有一个整型数0x12345678,从图中可以看出明原创 2021-01-06 18:30:37 · 11208 阅读 · 1 评论