
C语言
文章平均质量分 65
两片空白
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C语言qsort()库函数用回调函数的原因
qsort函数的参数里有一个函数指针,这个函数指针就是一个回调函数。不知道大家在刚开始学的时候会不会跟我有一样的疑问,这个qsort为什么要用回调函数,直接在库函数里使用一个固定名字的比较函数,然后在使用qsort函数时,约定要写一个固定函数名的比较函数不就好了?为啥还要使用回调函数呢?随着学习的深入,我对这个有了不一样的理解: 首先说明,库函数的源文件都是以二进制文件,也就是目标文件保存的。程序在链接时才会去链接去库函数。 如...原创 2021-09-04 19:18:59 · 174 阅读 · 0 评论 -
怎么理解后置++(--),先使用后自增原理
这里说明前置后置++和--,原理都一样,只是运算时不一样,下面就以++为例。相信大家对操作符++并不陌生,在学习时,老师都告诉我们一个口诀。前置++(--),先自增(减)后使用,后置++(--),先使用后自增(减).比如:相信大家对上面的现象也不陌生,但是大家知道究竟,计算机在前置++和后置++的时候干了什么吗?下面我们就来讨论讨论。原理储备知识: 计算机中能够进行运算的硬件是CPU,保存数据的硬件是内存。数据拿到CPU进行计算时也不是直接CPU使用内存的数据...原创 2021-09-01 18:17:01 · 2095 阅读 · 0 评论 -
栈帧详情转载
栈帧详解 我们知道,栈帧又称 过程活动记录,主要用于记录函数调用过程中的一些 局部变量和中间数据。 下面,我们用一个简单的程序的汇编过程来分析程序在内存中的存储情况。 主函数的汇编过程: 首先,我们都知道每一个栈帧都有其自己的栈底指针ebp和栈顶指针esp。每一个函数的每一次运行都需要在栈区中开辟出一个栈帧,可是一个CPU中的栈帧不可能无限的增加,所以,当有新的栈帧出现时...转载 2021-05-26 16:57:06 · 403 阅读 · 0 评论 -
C/C++ 内存分配
C/C++程序内存分配的几个区域1.代码区主要存放函数体的二进制代码2.字符常量区(只读) 字符串存储区间 相同的字符串存储地址相同。#include<stdio.h>int main(){ char *p1 = "abc"; char *p2= "abc";//用*p2='H',不可以被修改,p2存放的hellow world的地址,*p2相当于h,字符常量不可被修改 printf("%p\n", p1); printf("%p\n", p2); return .原创 2021-05-25 14:37:05 · 1514 阅读 · 13 评论 -
递归问题(斐波那契,青蛙跳台,汉诺塔)
文章目录一.递归介绍1.什么是递归2.递归的两个必要条件3.递归优缺点二.斐波那契数三.青蛙跳台四.汉诺塔一.递归介绍1.什么是递归程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中广泛应用。递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归主要的思考方式在于:把大事化小。2.递归的两个必要条件递归把大事化小同样满足原来的条件,才能实现自己调用自己。存在限制条件,每次递归调用之后越来越接近这个限制条件,当满足限制条件的时候,递归不再继续。原创 2021-05-23 16:30:33 · 319 阅读 · 2 评论 -
动态内存分配与静态内存分配
文章目录一.静态内存管理二.动态内存管理1.为什么存在动态内存管理2.动态内存函数的介绍1).malloc函数2.calloc函数3.realloc函数4.free函数5.动态开辟空间代码的标准写法一.静态内存管理静态内存是指程序开始运行时,由编译器自动分配和释放空间。程序中的各种变量,在程序编译时都需要分配空间,当函数调用完,空间自动释放。此时**用户不需要关心空间的申请与释放问题。**通常都储存在栈中。例如:int i=20;//在栈上开辟4字节的空间char a[10]={0};//在栈上开原创 2021-05-22 20:41:05 · 5169 阅读 · 2 评论 -
自定义类型(位段+枚举+联合)
文章目录1.位段位段的内存分配2.枚举3.联合(共同体)联合体对齐问题1.位段位段的声明和结构体类似,但是有两个不同。1.位段的成员必须是int,unsigned int 或char类型的。2. 位段成员名后面有一个冒号和一个数字。例如:struct S{ int a:2; int b:3; char c:4;};位段后面的数字代表比特位的个数。位段的内存分配#include<stdio.h>struct原创 2021-05-21 19:38:42 · 295 阅读 · 0 评论 -
结构体在内存中的存储(内存对齐)
文章目录一.内存对齐是什么二.怎样内存对齐一.内存对齐是什么首先看例子:#include<stdio.h>struct stu{ char a; int b; char c;};int main(){ printf("%d\n", sizeof(struct stu )); return 0;}输出:按照正常的思维,上述结构体中,两个char类型占一字节,一个int类型占四字节,一共应该是6字节,那为什么输出是12字节呢。再看一个代码。#include<原创 2021-05-21 15:07:35 · 1263 阅读 · 0 评论 -
求最大公约数之辗转相除法
文章目录一.前言二.辗转相除法原理三.用C语言求最大公约数一.前言最大公约数为两个及其以上的整数中约数最大的一个。也称为最大公因子,最大公因数。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。如果a能被b整除,那么a是b的倍数,b是a的约数。二.辗转相除法原理相信大家对辗转原创 2021-05-21 09:04:10 · 6153 阅读 · 6 评论 -
内存操作函数
文章目录一.内存操作函数1.memset函数2.memcpy函数3.memmove函数二.memcpy和memmove的模拟实现一.内存操作函数内存操作函数适用于任何类型,但是它是以字节为单位的。1.memset函数表现形式适用于任何类型可以从void *看出。作用将ptr从第一个开始的num个字节赋值为value。#include<stdio.h>#include<string.h>int main(){ int arr[10] = { 0 };原创 2021-05-20 09:20:18 · 272 阅读 · 0 评论 -
字符串函数与字符函数
文章目录一.字符串函数1.strlen strcpy strcmp strcat函数2.strncpy strncat strncmp函数3.strstr strtok函数二.字符函数1.isspace isdigit islower isupper 函数2.tolower toupper 函数一.字符串函数1.strlen strcpy strcmp strcat函数strlen函数表现形式返回值为无符号整形(unsigned int)最小值为0,参数为字符串起始地址。作用计算字原创 2021-05-19 20:16:23 · 167 阅读 · 0 评论 -
qsort函数详情
文章目录1.回调函数2.qsort函数的使用3.qsort函数的模拟实现1.回调函数2.qsort函数的使用3.qsort函数的模拟实现PS:void原创 2021-05-18 10:43:26 · 1545 阅读 · 0 评论 -
用C语言实现检验大小端存储模式
大端存储模式是指数据的低位保存在内存的高地址中,而数据的高位保存在低地址中。小端存储模式是指数据低位保存在内存低地址中,而数据高位保存在内存高地址中。主函数:#include<stdio.h>int main(){ int ret = check_sys(); if (ret == 1){ printf("小端\n"); } else{ printf("大端\n"); } return 0;}方法一:int check_sys(){ int x原创 2021-05-17 14:58:16 · 239 阅读 · 0 评论 -
帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)
文章目录1.指针数组2.数组指针3.函数指针4.函数指针数组1.指针数组- 表现形式类型+*+数组名+[常量表达式]例如:int *arr[5];- 定义指针数组实际是数组,里面的元素都是指针。例如:int *arr[3]={&a,&b,&c};arr[0]=&a,arr[1]=&b,arr[2]=&c*arr[0]=a,*arr[1]=b,*arr[2]=c#include<stdio.h>int main(){原创 2021-05-15 12:19:44 · 270 阅读 · 0 评论 -
整形类型的取值范围
对整形数据的取值范围做一个总结:1. 一字节8比特位:有符号位:-2^7 ~2 ^7-1无符号位:0~2^8-12. 二字节16比特位:有符号位:-2^15 ~ 2 ^15-1无符号位:0~2^16-13. 四字节32比特位:有符号位:-2^31~ 2 ^31-1无符号位:0~2^32-1...原创 2021-05-14 14:53:40 · 1555 阅读 · 2 评论 -
数据在内存中的存储
文章目录一.整形数据在内存中的存储。1.原码,反码,补码2.数据在内存中的存取二.大小端介绍1.什么是大端小端2.为什么有大端小端一.整形数据在内存中的存储。整形数据在内存中的存储是以二进制的形式,并且是以补码的形式进行存储的!1.原码,反码,补码计算机有符号数有三种表示方式,即原码,反码和补码。三种表示方式均有符号位和数值位组成,符号位用‘0’表示正,用‘1’表示负。原码:直接将二进制按照正负数的形式翻译成二进制。反码:将原码的符号位不变,其它依次取反。补码:反码进行加1。举个例子:整形原创 2021-05-14 14:40:39 · 548 阅读 · 0 评论 -
初识结构体1
文章目录1.结构体声明与定义3.结构体成员的访问4.结构体传参1.结构体声明与定义- 为什么有结构体计算机是为了解决人生活上的问题,当生活中需要记录一个人的信息时,需要记录这个人的不同类型的信息。比如名字,年龄,住址,电话等等。这是就形成了结构体。结构体是一些相同或者不同类型变量的集合,这些变量称为成员变量。结构体成员可以是常量,数组,指针,或者其它结构体。- 结构体的声明一般形式:struct 结构体名{结构体成员};此时的 struct 结构体名 (可自己定义) 相当于 结构原创 2021-05-12 10:08:15 · 386 阅读 · 0 评论 -
详解指针1
文章目录1.指针与指针变量2.野指针3.指针和数组4.二级指针5.指针数组和数组指针1.指针与指针变量- 为什么有指针?我们知道一般计算机能做运算的元器件是CPU,而数据是保存在内存中的。当需要进行运算时,计算机需要将数据从内存拿到CPU的寄存器中。为了方便CPU可以直接在保存数据的内存中直接拿到数据于是引入了指针。- 指针是什么?指针就是地址。数据就保存在该地址的内存中。- 什么是指针类型?指针类型是一种新类型,它的表现形式为 类型+*常见的指针类型有:int * //整形指针类型ch原创 2021-05-11 16:35:47 · 240 阅读 · 0 评论 -
详细刨析整形提升
文章目录一.整形提升1.概念2.怎么做二.例子一.整形提升1.概念整形提升是隐式转换的一种特殊情况。首先说明计算机进行逻辑和算术运算是在CPU相应运算器件内执行的。而数据是保存在内存里的,CPU进行运算时要将数据从内存保存到CPU的寄存器里。而CPU通用寄存的长度是与int(整形)字节长度相同,也就是4字节长度。所以当表达式中各种长度小于int长度的整形值做逻辑或者算术运算时,都必须先转为int或者unsigned int,然后再进行运算。例如:char a,b,c;a=b+c;此时b和原创 2021-05-10 10:25:53 · 190 阅读 · 1 评论 -
位操作符的注意点
文章目录一.位操作符1.分类及作用2.注意点二.重要例子一.位操作符1.分类及作用说明:计算机里的数在内存中存储是以0和1的形式,也就是二进制形式进行存储的& //按位与 作用:全1得1,有0得0| //按位或 作用:全0得0,有1得1.^ //按位异或 作用:相同得1,不同得02.注意点1.当一个数按位和0与(‘&’)时是将这一位清0。例如 要将数字10的第4个比特位清0,只需要将10&2即可。用图解释:2.当一个数和按位和1或(‘|原创 2021-05-09 14:56:10 · 159 阅读 · 0 评论 -
C语言数组知识点(一维 二维数组,传参)
一.数组的创建与初始化数组是一组相同类型函数的集合1.一维数组的创建一维数组创建方式:元素类型 + 数组名 + [常量表达式]一维数组创建实例://代码1char arr [10];int brr [5];//代码2int count = 5;int a[count];//这样创建是错误的注: 数组创建时,常量表达式一定要给一个常量,不能使用变量。2.一维数组的初始化数组的初始化是指在数组创建的同时给数组内容一些合理的初始值。例子:int arr原创 2021-05-08 10:18:32 · 792 阅读 · 3 评论 -
c语言多文件使用初理解
一.前言日常生活中编写程序时如果将函数语句全都堆放在一个源文件(.c)中,当程序需要减少,增加或增加内容时。会因为内容杂乱,语句多导致修改起来很困难。而多文件的使用很好的解决了这个问题,使函数条理变得清晰,易修改。二.多文件建立在一个单独目录中编写一个大型程序时,我们可一使用多文件的方式。建立一个头文件格式的.h文件,一个源文件格式的.c文件和一个头文件格式的.c文件。(PS:本人使用的是vs2013编译器。)1.头文件格式的.h文件这个文件是进行头文件以及函数和变量的声明。一般函数包括原创 2021-05-07 10:03:54 · 633 阅读 · 6 评论 -
对二分查找思想的理解
前言在日常生活中,查找的思想很常见。当我们在做查找动作时,首先我们想到的肯定是挨个查找,排除,也就是线性查找。但是如果我们使用二分查找的思想,不断将查找区间折半进行查找,这样的时间复杂度明显低于线性查找。一、什么是二分查找二分查找也叫折半查找,就是在一个有序(升序或者降序)的区间里找一个数,不断对区间进行折半进行查找,查找过程中不断对最大值和最小值进行更新,形成新的区间。直到找到为止。二分查找的查找效率是十分高效的,但是有一点特别需要注意:二分查找的目标序列必须是有序的或者是提前排好...原创 2021-05-02 17:47:02 · 428 阅读 · 0 评论 -
用指针方式实现实参随形参发生改变。
一:形参和实参1.什么是形参和实参。 当调用一个函数时,可以不向函数传入参数或者向函数里传入参数。当向函数里传入参数时,调用函数时传入的参数为实参,在函数里传入的参数为形参。int met(int b){ b++; return 0;}int main(){ int a = 1; met(a); return 0;}例如上述程序,main函数里的a为实参,函数met里的b为形参。二:如何实现形参实体化当我们调用函数时,当我们用函数的方法写代码,例如比大小,做加减等.原创 2021-05-02 00:42:58 · 857 阅读 · 4 评论