C语言基础知识
文章平均质量分 67
C语言学习记录
ych9527
这个作者很懒,什么都没留下…
展开
-
走进字符串函数
文章目录1.前言2.字符串的复制3.字符串的比较3.字符串的拼接4.查找一个字符5.查找任意几个字符6.查找一个子串7.统计字符串连续匹配字符的个属于8.分解字符串1.前言字符串函数的头文件是<string.h> ,字符串函数都有返回值,但是平时很少有人关心它们。用字符串函数对自身操作的结果都是未定义的,并没有标准会指明它们会产生什么样的结果2.字符串的复制strcpy和strncpy3.字符串的比较strcmp和strncmp,需要注意的是,字符串比较并不是返回布尔值,不能直接用原创 2021-03-26 15:49:17 · 1862 阅读 · 3 评论 -
头文件包含问题
文章目录1.前言2.头文件包含法则2.1 包含符号2.2注意事项1.前言今天在写代码时,用到了五六个文件夹,但是在包含头文件的时候不停的在报错,因此特地重温了下头文件的包含;2.头文件包含法则2.1 包含符号头文件包含符号分为两种:第一种为“”:先在当前工程保存目录下寻找,再去系统存放目录取寻找,常用于自定义头文件;第二种为<>:直接在系统目录下寻找,未找到则返回错误,不会在当前目录下寻找;因此,当我们需要使用自定义的头文件的时候,要么将头文件拷贝至当前工程目录,要么将其拷贝至系原创 2021-01-06 22:38:17 · 532 阅读 · 0 评论 -
位段、枚举、联合
文章目录1.位段1.1位段的声明1.2为什么要有位段1.3位段的存储形式1.4位段的缺点1.5知识点补充2.枚举2.1枚举的声明2.2枚举的使用2.3枚举的优点3.联合3.1联合的定义3.2联合的特点3.3实战演练3.3.1公用空间证明3.3.2利用联合的特性判定大小端3.3.3内存对齐证明1.位段1.1位段的声明1.位段的成员必须是 int, unsigned int , signed 即必须是整形家族;这是因为位段的成员是以比特位为单位进行存储的,假如是浮点类型,给成员一个5.3的容量,0.3的原创 2021-01-01 14:12:35 · 1276 阅读 · 2 评论 -
指针初理解
1.为什么要有指针内存作为计算机的储存器,所有的程序的运行,都是在内存中进行的。。内存相当于一个大盒子,再在其中分割出一个个不同的小格子,每个小格子即是一个个内存单元,每个内存单元的大小为字节。再比如,这个盒子足够的大,放入一个个小格子的东西非常多,当需要寻找的时候就非常麻烦,当给一个个小盒子进行编号后,寻找东西时只需要寻找对应的编号即可,这样寻找的效率提升许多,这些小格子即内存单元的编号就叫做该内存单元的地址。这些地址对应的内存单元储存着对应的信息,一般这个地址就叫做指针。 在计算机中指针可以提高信原创 2020-10-11 22:18:48 · 262 阅读 · 0 评论 -
sizeof和strlen计算数组类型和指针类型字符串
1.char arr是一个字符类型的数组,sizeof计算其大小的时候,是计算的这个数组所占的空间,char类型数组中,一个元素占一个字节,即没有包括\0;2.计算arr的长度的时候是检测到\0为止的,定义arr数组的时候是在一段内存中取四个字节,但是内存是连续的,用strlen计算的时候,会继续往下执行,因此长度是未知的。3.char*str是一个指针,里面储存的是字符串首地址,利用sizeof计算的时候计算的是指针的大小,和指针的内容没有关系,因此在32位操作系统下,指针所占的字节为4;4.利用.原创 2020-10-24 21:26:48 · 627 阅读 · 0 评论 -
关于指针的一些知识
1.什么是指针:定义一个指针int *p=&a;其中p叫做指针变量,是一个空间,&a是放在里面的内容,如图所示其中的&a叫做指针,即指针即是地址,地址即是指针;2.为什么要有指针:在电脑中,数据定义的数据存储在内存中,cpu需要用到时就与内存进行数据交换,内存概念图如下内存中以字节为最小单位,每个字节都对应有一个地址;在32位平台下,内存的最大有效空间为4G,为什么是4G稍后再谈,比如开始一个程序,CPU要在内存中找到一个“开始的命令”,如果没有地址,那么CPU想要找原创 2020-11-06 13:20:48 · 811 阅读 · 0 评论 -
char(int……)类型取值范围
先抛问题,为什么char的取值范围是-128-127或0-255呢?再做解答:概念悉知:char类型占一个字节,一个字节8个比特位。计算机中储存数字储存的是补码,正数的原返补相同;1.当char是无符号的时:8个比特位分布为 0000 0000 为最小值1,而当8个比特位分布为 1111 1111 时为最大值即2^8-1=255;2.当char是有符号类型时:最高比特位为符号位,因此在数值上的最大值为111 1111即2^7-1=127; 那么,还剩下一个比特位为符号位,那不就表示 取值范围为 -原创 2020-11-08 17:39:34 · 5811 阅读 · 6 评论 -
关于memset
总所周知,memset的作用是初始化函数,将某一块内存中的内存全部设置为指定值;这次想提的是容易犯错的两个点:1.memset初始化的最小单是字节,因此在初始化int类型的数组的时候,只能将其初始化为0或者-1;比如将其初始化为1时,1的二进制序列 0000 0001,int类型4个字节,那么会将其初始化为0000 0001 0000 0001 0000 0001 0000 0001,很显然与原意不符,使用时需要特别注意;2.注意,每次赋值都是1个字节为单位,因此初始化时,无符号类型的范围是0-2原创 2020-11-09 13:49:20 · 1228 阅读 · 0 评论 -
整形提升之原来如此
如何进行整体提升整形提升是按照变量的数据类型(自身!的数据类型)的符号位来提升的,有符号补符号位,没有符号补0;char c=-1在计算机 中的补码为1111 1111 ,将其提升成整形,变成32比特位,有符号位补符号位,因此变成 1111 1111 1111 1111 1111 1111 1111 1111(补码) ,因此为-1;(自身的数据类型,即signed char)char c=-1在计算机 中的补码为1111 1111 ,将其提升成整形,变成32比特位,有符号位补符号位,因此变成 11原创 2020-11-10 14:55:11 · 343 阅读 · 0 评论 -
浮点数在内存中的存储
正数在内存的存储是以最高位为符号位,其余为数值的二进制序列,那么浮点数在内存中是怎么进行存储的呢,接下来我们一起看一看;假设一个数为1154,那么用科学记数法可以表示为1.154*10^3,同理在计算机中也可以用科学计数法进行存储,那么他是怎么进行的呢?比如:10在计算机中是以二进制储存的,即1010,转化为科学技术法为 (-1)^s* 1.01*2^3;规定有,s为符号位,0代表正数,1代表正数,M=1.01代表有效数字,E=3, 2^E代表指数位; 对于32位浮点数,最高的一位比特位是符号s位,原创 2020-11-11 13:48:22 · 560 阅读 · 0 评论 -
const的作用
定义:const修饰的变量,不可以被直接修改;1.const修饰变量从定义中可以看出const修饰的变量还是可以被间接修改的,比如使用指针,如下图所示:很显然,途中用const修饰num,当直接进行修改时会进行报错处理;2.const修饰指针既然const可以修饰变量,那么指针呢,答案是肯定的,指针变量也是变量,它的类型是 type+*;const修饰指针时,位置的不同,作用也不一样,有下面两种情况:如图所示,const在左侧时,指针p指向的目标不可被改变;如图,const在右侧时,指原创 2020-11-12 09:49:15 · 545 阅读 · 0 评论 -
快速排序qsort的用法及模拟实现
一.定义悉知:1.1qsort是对指定的各元素进行无类型排序1.2为什么是无类型排序呢根据上图,c标准库的解释可以看到1.2.1 void base:void可以接收任意类型1.2.2 size_t :表示无符号整数,size_num表示需排序的元素个数1.2.3 size:表示每个元素的大小;1.2.4(compar)(const void,const void *):是一个函数指针,形参列表代表的是 待排序数据(内存块)序列中,任意一个元素的地址二.使用方法2.1一个函数要想实现排序原创 2020-11-17 11:04:12 · 350 阅读 · 0 评论 -
scanf gets fgets的差别
装一装文化人写个引子:由于上次写代码用scanf输入带空格的字符串发生的血的教训,特来将几个输入函数的区别分享出来。一.scanf int scanf(const char *format)scanf是从标准输入读取字符,输入多少他读取多少,直到达到换行或者空格结束,然后在字符串末尾添上 \0,不管你越界不越界。话不多说,上图 ~上图。二.gets char * gets ( char * str )gets 和scanf不一样了,他和scanf输入字符串时有点不同,他比scanf拽一点点,就是遇原创 2020-11-19 13:12:32 · 374 阅读 · 0 评论 -
一些字符串函数的对比
一.strcat和strncat(字符串拼接函数)strcatstrncatchar *strcat(char *destination,const *source)char *strcat(char *destination,const *source) ,size_t num源字符串必须以’\0’结尾相同拼接起始位置:目标字符串’\0’处相同–目标的空间必须有足够的大,能容纳源字符串的内容-相同-目标的空间必须可以被修改相同–不可以给自己拼接原创 2020-11-20 08:49:40 · 451 阅读 · 0 评论 -
memcpy和memmove的区别:内存重叠
1.在标准库中有一句关于memcpy和memmove区别的说明:使用memcpy进行拷贝时,内存不应该重叠,假如重叠使用memmove更加安全;这是为什么呢?我先从memcpy入手,模拟实现这个函数;代码如下void *my_memcpy(void *_str, const void *_scr, int num){ assert(_str&&_scr); char *str = (char *)_str;//将空类型强转为char类型,解引用+1移动为1字节; char *sc原创 2020-11-21 19:47:56 · 312 阅读 · 0 评论 -
结构体内存对齐————详情分析版
一.为什么要存在内存对齐呢?各位客官请听我细细分解我们都知道内存中的数据要想呈现出来,是要交给老大CPU去处理的。但是,不是每块内存的脾气都那么好,随便CPU去访问地址,某些硬件平台只能在某些地址处获取特定类型的数据,否则抛出硬件异常,下面我来解释一下最后一句话的意思;1.1首先我们定义一个结构体含有两个成员,在内存中的存储如图所示,又假设该平台内存给出了一个规则,CPU只能访问满足4的整数倍的地址;1.2如下图所示,当CPU想获取成员b的内容的时候,需要进行两次访问才可以获取b的完整内容,这样一来原创 2020-11-22 19:40:02 · 299 阅读 · 0 评论 -
阿托伊-atoi-运用解释和模拟实现
模拟实现atoi首先得知道该函数的功能atoi的函数声明为:int atoi(const char *str)由atoi的函数声明可知,接收字符串指针,返回整数;具体表现:假如字符串首端有空格则直接跳过,直到遇到第一个字符。若第一个字符为整数字符或带有符号的整数字符则一直检测下去,直到遇到非整数字符停止,然后将这一串整数字符以int类型返回;如果遇到的第一个字符非整数字符或者非符号位(‘+’,‘-’)则直接停止返回零;演示如下:1.遇到非整数外的字符为止2.跳过字符串首端空格,直到遇到原创 2020-11-25 15:33:24 · 368 阅读 · 0 评论 -
动态内存分配——申请与释放
一.为什么存在动态内存分配变量的定义大部分是在函数内,也就是在栈上开辟空间,而在栈上开辟空间有如下两个缺点第一:开辟出来的空间的大小是固定的,要么太小,要么太大,失去了灵活性;第二:栈上开辟的空间的大小是有限制的,假如需要大块的内存,那么在栈上是做不到的,比如定义一个数组 int arr[1000000];这样的需要大块内存的数组在栈上是开辟不了空间的;二.内存的申请malloc和calloc2.1 void*malloc (size_t size)由函数的声明我们可以知道,malloc的形参列原创 2020-11-26 09:03:25 · 972 阅读 · 0 评论 -
C语言——文件初识
1.什么是文件磁盘中的文件是文件,键盘是文件,显示器也是文件,所以有一句话叫做一切皆文件。但是从程序设计角度来说,文件一般有两种,程序文件和数据文件;程序文件:包含源程序文件(.c后缀),目标文件(windows环境后缀.obj),可执行文件(windows环境.exe);数据文件:程序运行时读取或输出的数据;接下来谈的主要是数据文件;2.为什么使用文件:程序运行时数据都是保存在内存之中,当退出程序这些数据就会消失;比如通讯录小程序,我们输入了联系人信息,一旦退出又要重新输入数据,这样的通讯录原创 2020-12-02 11:29:35 · 720 阅读 · 4 评论 -
编写一个程序,从标准输入读取几行输入,每行输入都要打印到标准输出上,前面要加上行号。
#include <stdio.h>#include <windows.h>#pragma warning (disable :4996)//编写一个程序,从标准输入读取几行输入,每行输入都要打印到标准输出上,前面要加上行号。//编写这个程序时要试图让程序能够处理输入行的长度没有限制int main(){ int lable = 1;//判断条件 int row = 1;//行数 int ch;//定义为整形是避免将字符解释为EOF,同时EOF是一个整形值,比字符原创 2020-12-08 10:43:26 · 560 阅读 · 0 评论 -
C语言之——整形、浮点家族
@1.整形家族1.1整形家族成员整形家族包括字符,短整形,整形,长整形,都分为有符号和无符号两种,再加上整形常量,即整形家族总共有9种类型;1.2整形家族成员长度比较需要注意的是:没有规则规定长整形一定要比整形长,而是长整形至少和整形一样长;比如...原创 2020-12-09 22:15:18 · 1297 阅读 · 0 评论 -
变量的三个属性——作用域、链接属性和存储类型
文章目录1.变量的声明和定义1.1变量的声明1.2变量的定义2.作用域2.1什么是作用域3.链接属性3.1链接external(外部)、internal(内部)、none(无)3.2 static和extern4.存储类型4.1存储位置4.2变量的默认存储类型取决于它的声明位置4.3 static和extern5.变量的初始化6小结static作用1.变量的声明和定义1.1变量的声明声明并不为变量开辟存储空间,声明只是为了向程序表明变量的类型和名字,在调用一个其它文件的函数或者全局变量的时候都需要进行原创 2020-12-13 17:31:39 · 2062 阅读 · 0 评论 -
数组
文章目录1.一维数组1.1什么数组1.2认识数组名1.3下标的引用1.4数组赋值效率1.5数组初始化1.5.1静态和动态初始化1.5.2不完整的初始化类型1.5.3字符数组初始化1.6数组名作为参数传参2.二维数组2.1二维数组的存储顺序2.2数组名2.3数组指针2.4二维数组名作为传参2.5指针数组3.C语言不提供下标越界检测4.总结5.习题练习1.一维数组1.1什么数组int value; int arr[10];变量value是单一的值称为标量,arr[10],是许多相同类型的标量组合而成的称原创 2020-12-17 20:13:35 · 639 阅读 · 0 评论 -
qsort用于结构体数组排序
用模拟的qsort进行解释结构体数组的排序typedef struct Stu{ char name[100]; char sex[10];}stu;void Swap(void *_x, void *_y,int size){ char *x = (char *)_x; char *y = (char *)_y; char temp = 0; while (size)//每次指针移动一个字节,将size(元素的带下)个字节全部交换 { temp = *x; *x = *y;原创 2020-12-20 12:49:25 · 2280 阅读 · 2 评论 -
看英文文档小妙招
有些文档只有英文版,又复制不下来,翻译非常的麻烦和不方便;下载下来价格又不菲,那么怎么办呢?登录QQ,按下 Ctrl + ALT + Q进行截图,小小的一个技巧,分享一下,就不必花钱去买文档了;...原创 2020-12-21 17:10:20 · 275 阅读 · 0 评论 -
为什么ASCII表2的图形打印不出来
文章目录1.ASCII表的由来2.ASCII表2来由3.为什么我们用不了ASCII表2呢1.ASCII表的由来在很久很久以前,有一座叫美利坚的小山头,当时就有几个老头儿不晓得从哪里捡来了8个闪闪发光的晶体管。他们发现利用这8个大宝贝进行不同的组合可以产生出非常奇异的力量;经过一段时间的研究,他们用这8个大宝贝组成了一个大宝贝,取名叫做计算机。每种小宝贝有两种变化形态打开和关闭,计算机呢由它们组成,于是乎有了2的8次方,即256种变化形态;他们几个又一琢磨,取出256种当中的127种用来表示自己文化当原创 2020-12-22 18:44:00 · 621 阅读 · 1 评论 -
宏定义和类型重定义
1.宏定义宏定义的语意是将……定义为……比如 #define MAX 100 ,的意思是将MAX定义为100,因此在后续使用MAX的时候就是表示100;需要注意的是语句后面不能带 ‘;’,如果带了,使用MAX的时候MAX表示的其实是**“100;”**,这样在检测代码的时候会很难发现这个细小的错误;2.类型重定义 typedef根据名字很好理解,就是将我们的类型重新定义一个别的名字,常用在结构体当中;比如:**typedef int TypeData;**这样在后续使用中,TypeData就代表关原创 2020-12-25 18:30:50 · 3072 阅读 · 0 评论 -
结构体指针和结构体变量
文章目录1.前言2.内存空间上面的差别3.访问上的差别1.前言今天在写题目的时候出现了一处小错误,就是由于结构体指针和结构体变量没有区分清楚,接下来谈一谈这两者的区别;2.内存空间上面的差别假设有如下代码:typedef struct Stu{ int age;}stu;此时定义一个结构体指针 stu *p; 一个结构体变量 stu q;结构体指针p是指向一个结构体的,这个结构体没有名字,它指向的是一个结构体空间的首地址;如果需要使用这个结构体就必须malloc一个空间出来或者将一个原创 2020-12-26 16:17:58 · 5206 阅读 · 0 评论