C语言
文章平均质量分 72
light_2025
Looking back, there is no regret !
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
初识C语言
4 输出函数printf(“hello world\n”) 打印函数(print function) \n:表示输入之后我要换行;11 输入函数scanf函数 scanf(“%d%d”,&num1,&num2);如果在int num=4前面输入const int num=4,此时固定num=4,是不可以修改的。(int num=4 是可以从新修改的 后面加上num=8是可以运行的)字符{'a','b','c',0}等价于“abc”字符串“abc”='a','b','c',\0。原创 2022-09-12 20:03:08 · 300 阅读 · 1 评论 -
初学C语言
此程序实际上输出的是5 因为数组的语法默认是输出下标的形式,数组定义下标是从0开始的,即1对应0, 2对应1,3对应2,4对应3,5对应4,以此输出。61十六进制转化为10进制 1*16的0次幂+6*16的一次幂=97 97对应a 所以下述输出a。int是定义整型函数,占用4个字节,32个比特位;定义int arr[10]={1,2,3,4,5,6,7,8,9,10};二进制位数的拼凑,每个1都占有不同的数值,需要几就去拼凑几,空的补0;一个‘=’叫做赋值,两个‘==’叫做相等;原创 2022-09-13 20:52:35 · 567 阅读 · 0 评论 -
初识C语言
(简单说就是13的程序,如果在另一个环境下输入static s_wo=2000,则extern会失效,因为static改变了变量的作用域)源文件只能在全局变量内部使用,出了源文件就无法使用。简单来说创建2个C环境,在其中一个环境下输入s_wo=2000,在另一个环境下输入下述函数,通过extern可以调用另一个环境中的赋值;最前面的1代表负号,2是从最后开始表示,0*2的0次幂+1*2的一次幂=2;反码:原码的符号位,也就是第一个第一个1表示正负不变,其余的取反得到反码;逻辑或||有一个为真即为真;原创 2022-09-15 21:45:21 · 488 阅读 · 0 评论 -
分支和循环(1)
是n=1,m=2进入,n进入switch语句,case1,m=3,n=1;因为case1下面没有break,所以继续往下执行,n=2,m=3;没有break,继续,n进入switch语句,case2,m=4,n=2;if(a==1)不符,if以下的语句不会执行,所以直接输出空白。是int a=8,则输出青少年,若想同时输出青少年+不能谈恋爱,必须加上大括号,大括号称作代码块。当表达式1为真时,执行语句1;当执行语句不是1-7的区间时,例如输出8,在语句最后加上。当表达式为真时,执行语句1,否则执行语句2.原创 2022-09-18 00:34:00 · 271 阅读 · 0 评论 -
分支与循环(2)
原因:虽然for语句中存在初始变量,i=0,j=0;但是判断条件是一个等号,为赋值,k始终赋值为0,为假,所以不执行for下面的语句。for循环找出n个数,n的阶乘的思路是定义ret,另ret=ret*i;中间加入while循环语句,消除上述提供的所有字符,因为每个字符结束时都是\n,所以直到不是转义字符,才循环下部分程序。break和continue和while语句中相同,break截断,continue语句陷入死循环;思路:在上述求阶乘的程序上,加入循环语句,限制n原创 2022-09-18 19:26:52 · 143 阅读 · 0 评论 -
分支+循环(习题)
6.sqrt表示开平方--数学库函数 需要头函数定义#includescanf函数是输入函数;printf函数是输出函数。goto语句:C语言中可以随意滥用的goto语句和标记跳转的标号。可能让代码执行的顺序出现混乱;(尽量少的去使用goto语句);为什么while循环不行呢)count是用来计算最后的个数的;tmp为定义临时函数。原创 2022-09-20 17:04:49 · 119 阅读 · 0 评论 -
函数的学习
原因在于:最后一个printf打印出43;是两个字符,返回第二个printf会变成2;打印第二个printf,会出现432;打印一个2是一个字符;第一个printf里面会变成1;所以最终打印出来的是4321。是一个大型程序中的某部分代码,由一个或多个语句块组成;函数一般会有输入参数并且有返回值,提供对过程的封装和细节的隐藏。是计算机提供给我们的语言,等同于英语上的短语、语法;-string copy(‘\n同时也拷贝’)void表示无返回;函数是可以进行嵌套使用的;(自己写一个函数的基本方法)原创 2022-09-22 19:29:04 · 361 阅读 · 0 评论 -
函数与递归(1)
(简单来说:栈溢出就是函数调用函数会在栈区占用空间,栈区的空间是有限的,当空间占用超出以后,会出现stack overflow)int main();printf hehe 从新套用main();main函数中套用main函数;把一个较大的问题转化为一个与原问题规模相似的较小的问题来考虑。大大减少了程序的代码量;是一个过程或者一个函数在其定义或者说明中直接或者间接调用自身的一种方法。递归必须有执行的条件,以及结束的条件,否则递归将陷入死循环。void函数中两个print开启递归;递归常见的错误:栈溢出。原创 2022-09-26 08:22:07 · 226 阅读 · 0 评论 -
C语言数组(1)
break语句只能用于for循环和switch循环,在if语句中不能使用,因为if语句是条件语句,不是循环语句,所以不能用break来结束;for循环通过每个数组成员的下角标打印数组的内容;就是说&arr[0]和打印arr得到的地址是一样的;也就是强调打印数组的地址是打印是arr中首元素的地址;的sizeof(数组名)-数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小;既然对arr进行传参,传过去的是首元素的地址,为什么定义函数的时候不用指针函数;&数组名,取出的是整个数组的地址;原创 2022-09-26 20:40:04 · 409 阅读 · 0 评论 -
C语言总结
二进制位011(1*2的0次幂+1*2的一次幂)b=5;二进制位101(1*2的0次幂+0*2的一次幂+1*2的一次幂) 两个按位异或,第一次异或110给到a,第二次异或011给到b,第三次异或101给到a,进而实现a b之间的交换;的意思是按照(二进制)位异或,即相同为0,相异为1;异或是二进制代码,相同为0,相异为1;原创 2022-09-30 15:43:17 · 183 阅读 · 0 评论 -
C语言操作符
00000000000000000000000000000001(如果得到这个,因为1的二进制最右边一定是1,所以只要和1按位与得到最右侧是1,num的二进制数最右侧一定是1;以此开始循环,让num向右按位与,只要和1按位与等于1,我就记录一次;复杂表达式在不同的环境下结果可能是不一样的,写代码是一定注意写出一个具有唯一路径的代码;让num和1进行按位与&得到:(有一个0即为0,两个都是1才为1)移位操作符移动的是二进制位,1个整型含有4个字节,32个比特位;,a只要不存在是0,b和d就会参与正常的运算。原创 2022-10-02 17:46:00 · 412 阅读 · 0 评论 -
C语言指针
不管是pa还是pc指针,在int和char下的地址是一样的;所以第一项和第三项是一样的,但是第二项定义的是整型,第四项定义的是char;是编程语言中的一个对象,简单来说就是将地址称作指针,就是说通过指针能找到以他为地址的内存单元;当指针有用时,我们对其进行初始化,让其代表地址;指针其实就是一个变量,变量里面存的是地址;不管指针是pa也好,或者是pc,在int 和char定义下的地址是一样的;字符数组--存放字符;指针数组--存放指针;前两个打印的都是首元素的地址;指针数组--数组--存放指针的数组;原创 2022-10-04 18:07:16 · 1040 阅读 · 0 评论 -
C语言相关习题
注意的13的二进制数是1101 记为n;n-1的二进制数是1110 n&(n-1)=1100 记为n,n-1的二进制是1011 n&(n-1)=1000 记为n;n-1的二进制是0111;得到如下规律,每一次的n和n-1进行按位与&,都会使最右边的1消失;只要计算出两个整数m和n异或后有几个1即为最终的结果;借用上述算法计算二进制中有几个1;6.编程实现:两个整数m和n的二进制表达式中,有多少个位不同?第二种算法:通过移位操作符实现:求参数二进制中1的个数。原创 2022-10-06 17:56:06 · 191 阅读 · 0 评论 -
C语言初识结构体
往结构体关键字前+typedef表示创建一个类型stu;而往结构体关键字结尾+s1,s2,s3表示加一个变量;struct--结构体关键字;stu--结构体标签;struct stu--结构体类型。:进行各种优化,使得程序在代码大小和运行速度上都是最优的,大小上相对于Debug较小;是一些值的集合,这些值称作成员变量。结构的每个成员可以是不同类型的变量。:包含调试信息,不作任何优化,大小上相对于Release较大;结构体中可以放字符、变量、以及结构体(嵌套);结构变量的操作符是通过点访问的。原创 2022-10-10 17:20:23 · 214 阅读 · 0 评论 -
数据的存储(1)
short:短整型;long long:更长的整型;大端模式:将数据的低位保存在内存的高地址中;而数据的高位保存在内存的低地址中;小端模式:将数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中;14 00 00 00 大端;原码:直接将二进制数按照正负数的形式翻译成二进制就可以;负数计算补码,而正数的原码、反码、补码都是相同的,数据存放到内存中实际上存放的是二进制的补码;同样的16进制数:0x 00 00 00 14。负数的原码、反码、补码按照上述规则;正数的原码、反码、补码是相同的;原创 2022-10-10 20:22:14 · 115 阅读 · 0 评论 -
数据的储存
5.5写成二进制是 : 5是101,0.5是1 所以是101.1。所有的偶数一定不是素数,所有我只要找到100-200之间的所有奇数,在奇数的基础之上进行编译即可。写成(-1)^0*1.011*2^2 其中s=0;原创 2022-10-12 14:46:34 · 193 阅读 · 0 评论 -
C指针指针
第二种情况:打印出来的是hehe 因为指针取地址 ,首元素地址是相同的;该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素是int型;每个数组有10个元素,每个元素的类型是int *parr1的指针数组;第三个是一个指针,该指针指向的数组有10个元素,每个数组的类型是int 的数组指针;指针是有类型的:指针的类型决定了指针加减整数的步长,代表了指针解应用操作时的权限;pc是字符指针-指向字符的指针-可以存放字符的地址;数组指针就是指向数组的指针-可以存放数组的地址;原创 2022-10-12 18:24:09 · 139 阅读 · 0 评论 -
指针详解(2)
第一种本身就是数组,在整型下传参,标注或者不标注元素个数10都无所谓;第三种字符传参也是没有问题的;第四种把数组传过去也是没有问题的;第一种情况:是可以的;第二种情况也是可以的;但是注意第三种情况是不可以的;(二维数组传参可以省略行,但一定不能省略列);1.数组参数、指针参数。原创 2022-10-13 21:08:57 · 105 阅读 · 0 评论 -
指针详解(3)
具体含义表示把0强制类型转换成: void(*)()--函数指针类型--0表示函数的地址;signed是一个函数声明:signal函数的参数有两个,第一个是int,第二个是函数指针void(*)(int),该函数指针指向的函数参数是int,返回类型是void;-------指向函数数组的指针;signal函数的返回类型也是一个函数指针,该函数指针指向的函数参数是int,返回类型是void;:int(*p)(int,int)------函数指针;:在函数指针中+[4]----------函数指针数组;原创 2022-10-17 16:48:16 · 244 阅读 · 0 评论 -
函数指针详解
第七个:sizeof(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址,还是4/8;2. &数组名 ----数组名表示整个数组;库函数qsort-------C语言中提供的库函数-------可以排序任意类型的数据;第七个:sizeof(*&a) &a表示整个数组的地址,解引用表示取出整个数组的地址,所以此时表示整个数组的大小;第三个:sizeof(*arr) arr表示首元素的大小,*arr表示解引用首元素,所以表示第一个元素,所以是1;原创 2022-10-21 17:47:29 · 941 阅读 · 0 评论 -
指针相关题
a[0]单独出现表示首元素的大小,也就是第一行元素的大小,但是当a[0]出现在表达式中,也就是出现在a[0]+1之中的时候,a[0]表示第一行第一个元素的大小,a[0]+1 表示第一行第二个元素的地址,也就是4;a[0]只要不是单独存在,就是表示首元素的地址,二位数组中首元素地址表示第一行元素的地址,a[0]+1 就是表示第二行元素的地址,只要是地址,就是4/8;a表示首元素的地址,在二维数组中,也就是第一行元素的地址,a+1表示第二行元素的地址,只要是地址,就是4/8;上面的是字符,是没有结束标志\0;原创 2022-10-24 08:11:31 · 151 阅读 · 0 评论 -
指针相关练习
0x是十六进制位的前缀,p是结构体指针,p+1表示加上一个结构体的大小(字符+1表示加上一个字符的大小),题目说明结构体的变量大小为20个字节,p=0x100000+20=0x100014(14的意思是该指针数十六进制位,4*16^0+1*16^1=14)补全十六进制位的8位是0x00100014;*(a+1):a既没有sizeof,也没有&a,所以在此a表示首元素的地址,a+1 解引用表示第二个元素,也就是2,所以最终答案是 2, 5;p[0]表示的是首元素的地址解引用,所以答案是1;原创 2022-10-27 20:29:03 · 237 阅读 · 0 评论 -
C语言指针进阶
---------表示三维指针-1;-----------表示cpp-2向后-2,来到c+3的位置上,解引用得到c+3对应的一维数组char*;数组传参,传过去的是首元素的地址;二维数组 cp[] 中含有四个元素,c+0/c+1/c+2/c+3 , c 表示一维数组,char**收到的是首元素的地址,也就是c+0对应char*----ENTER;强制类型转化为整型,存储在指针 ptr1 中,所以ptr1-1表示来到第一个数组最后一个元素的地址上,解引用得到最后一个元素的大小--------1;原创 2022-10-29 10:28:54 · 756 阅读 · 0 评论 -
字符串函数的使用
如果字符串arr2仅仅只有5个字符,而strncmp需要复制字符串的设定为6,则会把结束标志 \0 一并cpy过去,会造成打印出来的arr1因为结束标志\0的存在,而造成打印的结果为hello;指针用不用带 * 号是根据你的需要判断的:带 * 号意味着取地址,数组传参得到的是首元素的地址,比较首元素时带*号;无符号数-3打印出来 ,一定是大于0的,所以打印出来结果是hehe;然后进行循环:循环条件是:每减一次就会少一行或者一列----------最少最少要到达二维数组左下角的元素,所以x++最多加到2;原创 2022-11-08 14:50:43 · 842 阅读 · 0 评论 -
C语言知识点补充
register(寄存器关键字,用register创建的关键字存到寄存器里面)----计算机里存储位置有网盘2T、硬盘500G、内存8-16G、高速缓存几十mb、寄存器-很小很小;也就是说:我们拿到一个数,拿到的是他的原码,需要经过原码-反码-补码-反码-原码;最终打印出来的是原码;结构体是一些值的集合,这些值统称为结构体变量,不同于数组的是,结构体变量可以是不同的类型,而数组中的元素必须是相同的类型;-----如果字符串是abc,%-5s会显示结果为。-----如果字符串是abc,%5s会显示结果为。原创 2022-11-09 10:52:42 · 1732 阅读 · 0 评论 -
C语言_字符函数
原因在于该函数源函数是用const修饰的,并且强制类型转换为char* ,一个字符一个字符的拷贝,当1拷贝到3地址上,2拷贝到4地址上,考虑到把3拷贝到5地址时,3地址上的存放的不再是3,而是1,此拷贝过程会把1重新拷贝到5的地址上,后续过程会重复此操作;首先定义空指针ret,for循环,初始化ret=第一次分割,限制条件,ret不等于空指针,我们知道strtok函数一旦返回NULL,意味着分割完成,所有设定的sep分割符都已经找到,所以知道不返回NULL,我就循环,每循环一次,我就打印一次ret;原创 2022-12-26 20:25:45 · 334 阅读 · 0 评论 -
C语言_实现通讯录
为了防止不经意的看错菜单里的功能代码,可以在枚举的成员变量里直接写明菜单的功能,ag . EXIT离开;ADD增加 等等,防止因看错数字而干扰到用户的使用;枚举的成员变量先天规定默认第一个成员变量代码为0 ,依次类推;枚举的成员变量是用逗号隔开的,最后一个成员变量没有符号;枚举的成员变量通常用大写来表示,枚举大大增加了代码的可读性,比较两个数据的大小;原创 2023-01-04 21:48:53 · 805 阅读 · 0 评论 -
C语言_自定义数据类型
首先假设我们定义stuct A a ,结构体变量为a,位段为结构体变量开辟内存时,会根据位段的类型进行开辟,供所有位段成员使用,题中成员类型为int 型,我开辟一个整型供所有成员使用,int 占4个字节,32个比特位,a 占2个,b 占5个,c 占10个,32-17=15;S4中包含S3嵌套,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有对齐数(含嵌套结构体的对齐数)的整数倍;char占用 1 个字节,对齐数是8,则char 的对齐数是最小对齐数,也就是1;原创 2023-01-04 21:50:35 · 2382 阅读 · 0 评论 -
C语言_动态内存管理
在GetMemory函数中,开辟动态内存强制类型转换为char类型,存放在一块新开辟的地址上,p代表这么新开辟的内存,但是当返回到GetMemory函数以后,函数中存放的还是NULL,原本的空间p会丢失,也可以说代表这块空间地址的指针p会丢失(p是GetMemory函数的形参,只在GetMemory函数的内部有效,当返回到Test内以后,p会丢失其地址),所以strcpy字符串拷贝会崩溃,因为str是NULL,想要把hello world拷贝到NULL上,NULL是没有具体意义的;这种错误是比较好理解的;原创 2023-01-04 21:54:56 · 941 阅读 · 0 评论 -
C语言_动态内存分配版通讯录
2. 普通的通讯录我们初始化时,定义两个成员变量,一个通讯录能够容纳的总人数,我们即为MAX;另一个是我们已经加上的好友个数size;动态版通讯录因为不存在总人数,所以我们需要定义一个容纳量,当超过这个容纳量,我们就进行动态开辟内存;1. 普通的通讯录我们首先会初始化一个我们想要的值作为通讯录的总人数;这个值一旦定义,就意味着我们编写的这个通讯录总人数就会有上限;比方说我们的qq群、微信群的人数上限;3. 动态开辟的内存在离开通讯录时需要进行内存释放;原创 2023-01-09 22:26:23 · 555 阅读 · 0 评论 -
C语言_文件操作(上)
简单来说该文件指针就类似与结构体指针的功能,我拿到文件指针就能够访问该文件指针指向的文件,并且进行相应地操作;每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(文件的名字、文件状态、文件的当前位置等)。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并且填充其中的信息;打开文件以后,也需要fclose关闭文件,将文件所指向的指针赋值为空指针;2. 打开文件的过程是:该文件所指向的指针首先向保存该文件的文件信息区访问,文件缓冲区满以后会访问该文件。原创 2023-01-09 22:27:03 · 810 阅读 · 0 评论 -
C语言_文件版动态内存管理通讯录
【代码】C语言_文件版动态内存管理通讯录。原创 2023-01-09 22:27:58 · 1536 阅读 · 0 评论 -
C语言_程序环境和预处理
当存在外部声明的函数时,主函数调用外部声明的函数是通过符号表调用的,更精确的来说是在符号表中查找声明函数的地址,如果声明函数的地址无效,程序就会报错,找不到外部声明函数;但是不同的目标文件是有不同的符号表的(函数可能相同,但函数对应的地址是不同的),将不同目标函数的符号表进行合并和重定位的过程我们称作符号表的合并和符号表的重定位;但是不同的目标文件是有不同的符号表的(函数可能相同,但函数对应的地址是不同的),将不同目标函数的符号表进行合并和重定位的过程我们称作符号表的合并和符号表的重定位;原创 2023-01-11 12:02:26 · 657 阅读 · 0 评论 -
C语言_文件操作(下)
1. 文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets);EOF---end of file(文件结束标志)2. 二进制文件的读取结束判断,判断fread返回值是否小于实际要读的个数;:让文件指针的位置回到起始位置;原创 2023-01-11 12:01:52 · 492 阅读 · 0 评论 -
C语言_Printf函数返回值
首先先分析这个结构,第三个printf函数,显然打印结果是 43;但是第二个 printf函数,我们不能天真的认为第二个 printf函数 打印 43;这里要注意 printf函数 的返回值,这个 2 的意思就是第三个 printf函数的返回值为 2,通过上述的学习,我们知道,printf函数返回值是打印字符的数量,43 对应字符数量为 2。,我们执行第三个 printf 函数,输出结果 43。:两个数字,一个逗号,两个空格,一个字符,一个换行符。,我们执行第一个 printf 函数,可以看成。原创 2023-04-24 21:28:52 · 1343 阅读 · 0 评论
分享