![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 71
C语言知识点总结及练习
双鱼211
这个作者很懒,什么都没留下…
展开
-
浅谈-[柔性数组]
目录:1.什么是柔性数组2.柔性数组的特点:3.柔性数组的使用• 代码说明• 图解说明• 运行结果4.非柔性数组• 代码说明• 图解说明• 运行结果5.使用柔性数组的好处1.什么是柔性数组在C99中,结构中最后一个元素允许是未知大小的数组,这就叫做柔性数组成员例如:typedef struct S{ int i; int arr[];//柔性数组成员}S;或者typedef struct S{ int i; int arr[0];//柔性数组成员}S;2.柔性数组的特点原创 2021-02-19 12:03:39 · 226 阅读 · 0 评论 -
为什么存在动态内存分配,动态内存函数(malloc函数,free函数,calloc函数,realloc函数)
目录:1.当前我们知道的内存的使用方法2.为什么存在动态内存分配3.动态内存函数3.1 malloc 和 free(1) malloc函数(2) free函数(3) 举例说明malloc函数和free函数如何使用a. 开辟10个整形大小的空间,并将0-9放入b. 开辟空间失败,并打印开辟失败原因3.2 calloc(1) calloc函数(3) 举例说明calloc函数如何使用a.开辟10个整形大小的空间并初始化为03.3 realloc(1) realloc函数(2)realloc在调整内存空间存在的两种原创 2021-02-17 16:47:58 · 1206 阅读 · 4 评论 -
C语言--找出单身狗问题
目录:1.单身狗问题分析思路2.代码3.运行结果1.单身狗问题分析思路单身狗:一组元素中只出现一次的数字eg:{ 18,10,1, 1, 8, 2, 9, 9 ,3, 4, 4, 8, 6, 6, 12, 12,10}单身狗:2,3,18思路:首先对该组元素进行冒泡排序(按升序举例) 从首元素开始将相邻元素进行比较,如果相邻的两个数相等i+2,如果相邻的两个数不相等i+12.代码#include<stdio.h>//冒泡原创 2021-01-23 16:01:08 · 1074 阅读 · 0 评论 -
#define定义宏-->(宏常量和宏函数)
目录:1.#define 宏2.宏常量3.宏函数4.宏函数的错误书写(1)代码(2)分析(3)错误运行结果(4)正确格式如下:(5)正确运行结果1.#define 宏宏可分为以下两类宏常量语法实例: #define N 10宏函数语法实例:#define ADD(x,y) ((x)+(y))注意:宏后面没有分号(;) 宏函数不是真正的函数,是一种替换机制2.宏常量#include<stdio原创 2021-01-22 17:23:01 · 1087 阅读 · 2 评论 -
C语言实现简单的通讯录
1.通讯录的功能a.存放好友信息(姓名,地址,电话,年龄)b.添加联系人信息(增)c.删除联系人信息(删)d.修改联系人信息(改)e.查找联系人信息(查)f.查看所有联系人信息满足日常存储信息的需求,可满足定量的通讯录信息管理,实现增删查改功能。2.运行效果(1)添加联系人信息(增)(2)删除联系人信息(删)(3)修改联系人信息(改)(4)查找联系人信息(查)3.源代码(1)ContactBook.h声明函数#define _CRT_SECURE_NO_WARNING原创 2021-01-20 21:48:51 · 610 阅读 · 0 评论 -
联合(共用体),枚举
目录:1.联合2.联合的声明和定义3.联合大小的计算(1)举例说明4.使用联合判断当前机器的大小端问题1.联合联合是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)2.联合的声明和定义union Un{ int i; char c;};int main(){ //联合变量的定义 union Un un; printf("%d\n", sizeof(un)); un.i = 0x12345678; un.c = 0x原创 2021-01-19 11:03:34 · 324 阅读 · 1 评论 -
结构体的内存对齐,计算结构体的大小,修改默认对齐数
目录:1.结构体的内存对齐规则2.举例说明(1)例一:计算结构体占多大空间a.代码b.分析c.运行结果(2)例二:计算结构体的大小a.代码b.分析c.运行结果(3)例三:计算结构体的大小(结构体嵌套问题)a.代码b.分析c.运行结果1.结构体的内存对齐规则1. 第一个成员在与结构体变量偏移量为0的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数=编译器默认的一个对齐数与该成员的大小的较小值• VS中默认值为83. 结构体的总大小为最大对齐数(每个成员变量都有一个对齐数原创 2021-01-19 09:51:42 · 745 阅读 · 2 评论 -
内存操作函数:memcpy函数,memove函数
目录:1.memcpy函数(内存拷贝)(1)memcpy函数的说明(2)memcpy的使用a.代码b.结果(3)memcpy的模拟实现a.代码b.结果2.memmove函数(1)memmove函数的说明(2)内存重叠问题a.分析b.代码说明(3)内存重叠问题的解决分析(4)memmove的使用(5)模拟实现memmove1.memcpy函数(内存拷贝)(1)memcpy函数的说明• 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。• 这个函数在原创 2021-01-18 11:45:19 · 2917 阅读 · 5 评论 -
整型存储(截断和提升)
目录:整型存储练习1.练习一:如下程序输出a,b,c分别是多少a.分析b.运行结果2.练习二:下面程序输出什么?a.分析b.运行结果3.练习三:下面代码输出结果是什么?a.分析b.运行结果4.练习四:下面代码输出结果是什么?a.分析b.运行结果5.练习五:下面代码输出结果是什么?a.分析b.运行结果整型存储练习1.练习一:如下程序输出a,b,c分别是多少#include <stdio.h>int main(){ char a= -1; signed char b=-1;原创 2021-01-17 12:15:24 · 1059 阅读 · 1 评论 -
打印“水仙花数”,变种水仙花数
打印"水仙花数"1.题目求出0~100000之间的所有“水仙花数”并输出。“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。2.代码#include<stdio.h>#include<math.h>int main(){ int i = 0; for (i = 0; i < 100000; i++) { int n = 1; int sum = 0; //保存i原创 2021-01-15 21:15:02 · 341 阅读 · 1 评论 -
字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数
目录:1.字符串函数strlen(1)strlen函数(2)strlen的使用a.代码b.运行结果(3)模拟实现strlen函数a.代码b.运行结果(4)注意:2.字符串函数strcpy(1)strcpy函数(2)strcpy的使用a.代码b.运行结果c.错误举例(3)模拟实现strcpya.代码3.字符串函数strcat(1)strcat函数1.字符串函数strlen(1)strlen函数strlen函数返回的是在字符串中’\0’前面出现的字符的个数(2)strlen的使用a.代码#inclu原创 2021-01-14 17:46:58 · 171079 阅读 · 34 评论 -
计算一元二次方程
目录:计算一元二次方程(1)题目描述(2)输入描述(3)输出描述(4)代码(5)运行结果计算一元二次方程(1)题目描述从键盘输入a, b, c的值,编程计算并输出一元二次方程ax2 + bx + c = 0的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据△ = b2 - 4ac的三种情况计算并输出方程的根。(2)输入描述多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax2 + bx + c = 0的系数。(3原创 2021-01-13 22:05:52 · 1766 阅读 · 1 评论 -
打印菱形,喝汽水问题,杨辉三角,猜凶手问题,猜名次问题
目录1.打印菱形(1)题目(2)分析(3)代码(4)运行结果2.喝汽水问题(1)题目(2)分析(3)代码(4)运行结果3.杨辉三角(1)题目(2)分析(3)代码(4)运行结果4.猜凶手问题(1)题目(2)分析(3)代码(4)运行结果5.猜名次(1)题目(2)分析(3)代码(4)运行结果1.打印菱形(1)题目用C语言在屏幕上输出以下图案:(2)分析(3)代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main()原创 2021-01-02 15:23:54 · 2109 阅读 · 4 评论 -
函数指针
目录:1.函数指针和数组指针类似,都是嵌套定义2.用函数指针可以反过来调用函数3.《C陷阱和缺陷》中代码解析4.实现计算器并用函数指针优化1.函数指针和数组指针类似,都是嵌套定义void(*pfunc1)() = test;void(*pfunc2)() = &test;char* (*pfunc3)(int*) = test1;2.用函数指针可以反过来调用函数 (*pfunc1)(); pfunc1();例子如下#include<stdio.h>void tes原创 2020-12-29 14:54:48 · 2029 阅读 · 1 评论 -
指针,解引用,指针数组和数组指针的区别,数组名和&数组名的区别
目录:1.指针是什么?2.指针的解引用3.指针数组和数组指针4.数组名和&数组名5.例题求指针和数组大小例1.求下面代码输出的结果例2.求下面代码输出的结果例3.求下面代码输出的结果例4.求下面代码输出的结果6.关于指针和数组开空间的例题1.指针是什么?(1)指针就是个变量,用来存放地址的变量(指针就是地址)(2)指针的大小是固定的4/8个字节(32位平台/64位平台) eg: int a = 10;  原创 2020-12-26 17:43:48 · 2832 阅读 · 3 评论 -
浮点型在内存中的存储
1.根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式(1) (-1)^S * M *2^E(2) (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。(3) M表示有效数字,大于等于1,小于2.(4) 2^E表示指数位。a.小数如何进行二进制转换eg:10.25的二进制数为1010.01 10.125的二进制数为1010.001b.浮点数在内原创 2020-12-24 15:50:16 · 977 阅读 · 1 评论 -
截断,整形提升,大端小端
目录:1.大端小端(1)什么是大小端?(2)百度笔试题(设计一个程序判断当前机器是大端机还是小端机)1.大端小端(1)什么是大小端?大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。**注:**只有在小端机内存中左边是低地址,右边是高地址;其余都是左边是高地址右边是低地址。(2)百度笔试题(设计一个程序判断当前机器是大端机还是小端机)...原创 2020-12-22 12:44:34 · 1328 阅读 · 2 评论 -
递归相关例题
目录:例1:分别使用递归和非递归求n的阶乘方法一:递归方法二:非递归例2:分别使用递归和非递归实现strlen的模拟方法一:递归方法二:非递归例3:计算一个数的每位之和方法一:递归方法二:非递归4.编使用递归和非递归实现n的k次方方法一:递归方法二:非递归例1:分别使用递归和非递归求n的阶乘方法一:递归#include<stdio.h>int Factorials(int x){ if (x < 2) { return 1; } return Factorials(x原创 2020-12-19 17:30:49 · 1041 阅读 · 2 评论 -
浅谈strlen和sizeof的区别
strlen和sizeof的区别1.strlen是函数,sizeof是关键字2.strlen是用来计算字符串的长度的,并且长度中不包含\03.sizeof计算类型占用字节的数量,计算的是字符串占用内存的大小,计算\04.sizeof并不只能计算字符串的占用字节数量,还可以计算类型占用字节的数量...原创 2020-12-19 15:06:49 · 193 阅读 · 3 评论 -
野指针,数组指针,指针数组
目录:1.野指针(1)什么是野指针?(2)野指针的成因a.指针为初始化b.指针访问越界2.指针数组和数组指针(1)指针数组(2)数组指针(3)指针数组和数组指针+1的区别1.野指针(1)什么是野指针?野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)(2)野指针的成因a.指针为初始化全局变量,静态变量未初始化默认是会初始化的,默认是0其他变量都不会初始化,默认是随机值eg:#include<stdio.h>int main(){ int* p; //局原创 2020-12-17 16:31:40 · 2404 阅读 · 1 评论 -
操作符(二) (单目操作符,逻辑操作符,条件操作符,逗号表达式)
目录:1.单目操作符(1)逻辑取反(!)(2)按位取反(~)eg1:求~1eg2: ~(-1)2.逻辑操作符eg1:360笔试题eg2:例一变形3.条件操作符4.逗号表达式5.下标引用6.表达式求值的顺序7.连续赋值1.单目操作符! //逻辑反操作- //负值+ //正值& //取地址sizeof //操作数的类型长度(以字节为单位)~ //对一个数的二进制按位取反-- //前置,后置--++原创 2020-12-14 21:17:30 · 534 阅读 · 2 评论 -
简易的三子棋游戏(C语言)
目录:1.游戏介绍2.游戏效果3.源代码(1)头文件命名为为game.h(2)游戏文件命名为game.c(3)测试文件命名为test.c1.游戏介绍 三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。2.游戏效果3.源代码(1)头文件命名为为game.h主要是整个程序中函数的声明#include<st原创 2020-12-11 18:04:50 · 2970 阅读 · 7 评论 -
操作符(一)(算数操作符,位移操作符,位操作符)
目录:1.算术操作符2.位移操作符(1) << 左移操作符(高位丢掉,低位补0):eg:将1左移1位(2) >> 右移操作符:eg:将1右移一位3.位操作符eg:不创建临时变量(第三个变量),实现两个数的交换1.算术操作符+ - * / %· 使用方法:(1)%操作符的操作数必须为整数,其余几个操作符可以作用于整数也可以作用于浮点数。(2)/操作符如果两个操作数都是整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。原创 2020-12-10 15:16:06 · 1880 阅读 · 4 评论 -
原码,反码,补码
目录:1.原码2.反码3.补码(计算机中存储补码)1.原码原码: 整数直接转化成二进制;用最高位表示符号位,“1”表示负号,“0”表示正号eg:1的原码是00000000 00000000 00000000 00000001 -1的原码是10000000 00000000 00000000 000000012.反码反码:正数:原码=反码=补码负数的反码:原码符号位不变其他位取反eg:1的反码是01111111 111111原创 2020-12-09 21:51:03 · 252 阅读 · 1 评论 -
冒泡排序
冒泡排序步骤:从数组头部开始,不断比较相邻的两个元素的大小,通过交换把最大的元素逐渐后移直到数组的末尾;第一轮结束将最大的元素移到最后一位,第二轮将较大的元素移到倒是第二位,如此循环,进行(n-1)次冒泡后就可以完成所有元素的排序//冒泡排序将数由小到大排序#include<stdio.h>void BubbleSort(int* p, int n) //n控制数组的大小{ int end = n; while(end > 0) //控制每次冒泡的结束位置 { int原创 2020-12-09 18:23:38 · 252 阅读 · 0 评论 -
数组(一维,二维)
目录:1.一维数组的创建和初始化(1)一维数组的创建(2)数组的初始化2.一位数组在内存中的存储3.二维数组的创建和初始化(1)二维数组的创建(2)二维数组的初始化3.数组作为函数的参数1.一维数组的创建和初始化(1)一维数组的创建数组: 是一组相同类型元素的集合int arr[10];#define N 10int main(){ int arr1[N]; return 0;}注: 创建数组,[ ]中要给一个常量,不能给变量也不能为空(2)数组的初始化数组的初始化:是指在创建原创 2020-12-08 15:30:47 · 2153 阅读 · 2 评论 -
青蛙跳台阶问题的两种解法
青蛙跳台阶问题问:一只青蛙一次可以跳1层台阶一次也可以跳2层台阶,问青蛙跳到第n层台阶一共有多少种可能?解:思路:n=1 1种可能 n=2 2种可能 n=3 3种可能 &原创 2020-12-08 13:17:44 · 582 阅读 · 3 评论 -
函数递归及其例题
目录:1.什么是递归?2.例题(1)接受一个整数值,按顺序打印他的每一位(eg:输入1234;输出1 2 3 4)1.什么是递归?递归就是自己调用自己,一个过程或函数在其定义或说明中直接或间接调用自身的一种方法,其只要思想:大事化小;递归的两个必要条件1.存在限制条件,当满足这个限制条件的时候,递归便不再继续;2.每次递归调用之后越来越接近这个限制条件;2.例题(1)接受一个整数值,按顺序打印他的每一位(eg:输入1234;输出1 2 3 4)#include<stdio.h>原创 2020-12-07 21:40:20 · 972 阅读 · 1 评论 -
函数分类,函数的参数,函数的调用
目录:1.C语言中函数的的分类2.什么是库函数,如何去查看库函数,常见的库函数3.函数的参数(实参,形参)4.函数的调用(传值调用,传址调用)1.C语言中函数的的分类1.库函数2,自定义函数2.什么是库函数,如何去查看库函数,常见的库函数库函数:别人写好的经常会使用的函数 eg:strlen/scanf/printf推荐去:https://www.cplusplus.com查看库函数C语言常用的库函数:IO函数原创 2020-12-03 20:00:29 · 575 阅读 · 2 评论 -
二分查找法(折半查找算法)
二分查找(折半查找算法)二分查找又叫折半查找核心思想:控制搜索范围,每次要么找到要么排除上次查找数据量一半的数步骤: 1.先找出区间的中间值mid 2.比较中间值mid和求的值x的大小;如果要求的数x比mid小就取mid左边的区间继续进行二分查找;如果要求的数x比mid大就取mid右边的区间继续进行二分查找;如果要求的值x=mid返回mid;举例用二分查找法在一个0-9的数组中查找一个随机值并输出int main(){ int a[] = {原创 2020-12-02 13:57:49 · 860 阅读 · 2 评论 -
逆置字符串数组
代码如下//逆置字符串数组#include<stdio.h>#include<string.h>int main(){ char a[] = "hello word"; printf("%s\n", a); int len = strlen(a); //算出a的字符串长度11 int i = 0; int left = 0; //a[0]位置 int right = len - 1; //a[10]位置 while (left <原创 2020-12-01 18:58:07 · 2627 阅读 · 7 评论 -
switch语句,while语句,for循环,do...while()循环,goto语句
目录:1.switch语句(是一种分支语句)(1)switch语句的语法形式:(2)default子句2.while语句(可实现循环)(1)while语法形式(2)while语句与break(3)whlie语句与continue3.for循环(1)for循环语法形式(2)for循环和break(3)for循环和continue(4)for循环的变种4.do...while()循环(1)do...while()语法结构5.goto语句1.switch语句(是一种分支语句)(1)switch语句的语法形式:原创 2020-11-30 18:32:46 · 783 阅读 · 0 评论 -
C九九乘法表
C九九乘法表代码如下#include<stdio.h>int main(){ int i, j, c; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { c = i * j; printf("%d*%d=%2d ", i, j, c); //%2d表示固定输出两位 } printf("\n"); } return 0;}运行结果如下注:%2d只是为了美观,使相乘结果占原创 2020-11-29 22:56:23 · 256 阅读 · 1 评论 -
猜数游戏
猜数游戏代码如下#include<stdio.h>#include<stdlib.h>#include<time.h>void game(){ srand((unsigned int)time(NULL)); //srand((time(NULL))设计一个随机种子,每次运行都能保证随机种子不同 int x = rand() % 100; //100以内的随机值;rand()函数可以用来产生随机数,但这不是真正意义上的随机数,是一个伪随机原创 2020-11-29 22:19:04 · 263 阅读 · 1 评论 -
求最大公约数和最小公倍数
#include<stdio.h>int main(){ int a; int b; int c; printf("请输入两个数\n"); scanf_s("%d %d", &a, &b); while (1) { c = a % b; if (a % b == 0) { break; } a = b; b = c; } printf("最大公约数为%d\n",b); return 0;}...原创 2020-11-28 21:11:26 · 286 阅读 · 1 评论 -
#define宏,指针,结构体(struct),if语句(求100以内的偶数)
1.#define(1)#define可以定义常量#include<stdio.h>#define A 20int main(){ int b; printf("请输入一个数\n"); scanf_s("%d", &b); if (b < A) { printf("b小,b=%d\n",b); } else { printf("A小,A=%d\n", A); } return 0;}注:如上代码相当于给A赋值为20,如果改#d原创 2020-11-26 13:56:56 · 843 阅读 · 1 评论 -
数组 ,区分++i和i++ ,关键词typedef,关键词static
数组定义数组不初始化#include<stdio.h>int main(){ int arr1[10];//定义数组,不初始化里面的数的随机的 int i = 0; while (i < 10) { printf("%d\n", arr1[i]); i += 1; } return 0;}定义数组初始化#include<stdio.h>int main(){ int arr2[10] = {1,2,3,4,5};//定义数组初始化原创 2020-11-21 19:21:04 · 482 阅读 · 1 评论 -
转义字符,if语句,while语句,进制转换,函数调用
求字符串的长度strlen算字符串长度从开始位置到遇到\0为止(但不包含\0),所以输出的第一个字符串长度为6(“abcdef”)第二个字符串长度为12(一个转义字符占一个字节,所以上面的\t和\32分别算一个字节)注: (1) \t 水平制表符 (2) \r 回车 (3) \a 警告字符,蜂鸣 (4) \b 退格符 (5) \ddd ddd表示1-3个八进制的数字(小于8)eg:\234算一个字节,\369算两个字节 (6) \xdd dd表示1-2个十六进制数字(小于16)eg:\x6g算两个字原创 2020-11-19 17:30:53 · 501 阅读 · 1 评论 -
C语言数据类型
求不同数据类型在内存中占多大字节?#include <stdio.h>int main(){ short a; int b; long c; long long d; printf("The size of short is %d byte\n", sizeof(a)); printf("The size of int is %d byte\n", sizeof(b)); printf("The size of long is %d byte\n", sizeof(c));原创 2020-11-18 12:22:55 · 1118 阅读 · 3 评论