c自我学习
学习过程中的杂记
学会放下ta
#include <stdio.h>
int main()
{
printf("I love computer program and you!");
return 0;
}
展开
-
C语言的高级操作
1、内存碎片:在连续申请一个12字节的数据和一个16字节的数据之后,若把12字节的数据释放以后,再次申请就会在16字节后去申请,除非刚好申请12字节,可能会重新利用到。2、malloc函数申请内存从应用层到内核层,在回到应用层,花费大浪时间。基于此种情况,有天才程序猿发明了内存池:把之前用过的内存不用了先放到一边管理好,之后再申请时先看内存池里面有没有,够不够,再去申请内存程序一开始运行就自动定义的三流:标准输出流:stdin标准输入流:stdout标准错误流:stderr可用Linux的重定向原创 2022-07-07 13:42:15 · 444 阅读 · 0 评论 -
C语言文件的操作
如果打开成功则返回指向FILE结构的指针,否则返回null固定错误由于系统换行符与C语言不同,所以要区分文本文件和二进制文件,只有Unix是与C语言一样的,不需要区分文件类型。1.“r” 模式:1、读fgetc(FILE*)读取到unsigned char返回int型,如果文件结束或者遇到错误返回EOF,fgetc()与getc()两个功能一致,区别是fgetc()是一个函数,getc()是宏的实现,宏快一点点,但是宏可能反复调用参数,不能使用有副作用的参数如fp++可能调用后变为fp++++++原创 2022-07-06 13:21:33 · 473 阅读 · 0 评论 -
typedef
typedef给数据类型取别名。可以取多个,与define区分,define是硬性替换,typedef是别名,后者不受运算符优先级影响高阶typedef简化复杂声明原创 2022-07-05 19:28:09 · 92 阅读 · 0 评论 -
C语言单链表
单链表结构体->结构体==链表声明struct ListNode{ int data; struct ListNode *next;};建立头结点struct ListNode *head;head->next = NULL;//数据不需初始化申请新节点并插入,这里写头插法struct ListNode *p;p = (struct ListNode*)malloc(sizeof(struct ListNode));p->data = 1;p->ne原创 2022-06-24 16:15:25 · 69 阅读 · 0 评论 -
共用(联合)体
共用体(联合)与结构体区别就是共用体地址是一样的,同一时间只能用一个成员,共用体的占空间大小大于等于成员中最大的数据结构。初始化也只能初始化一个。union 名称{ 成员1; 成员2; 成员3; ...}枚举类型声明enum day{monday,tuesday,wednesday,thursday,friday,saturday,sunday};//这种是枚举常量enum day today;//这个是枚举变量today = monday;//给变量赋值枚举常量对应的数据类原创 2022-06-24 16:14:58 · 86 阅读 · 0 评论 -
C语言&位域
作用:能把一个字节八个位分开命名并使用,显著提升内存的利用率用处:单片机定义:在结构体定义的时候在成员后边加:写出占的位规定:位域的宽度不能超过所依附的数据类型的长度这里定义的一个结构体,里面a只占2二进制位,b只占1位,整个结构体只占3位,不能超过结构体数据类型长度解释:unsigned int 类型占4个字节,一共32位二进制,你就不能给a赋值占33位。就是没有名字的位域,作用大都是为了调整变量的位置,凑整数整字节支持位域的类型: int、signed int 和 unsigned int,_原创 2022-06-19 09:53:10 · 162 阅读 · 0 评论 -
【函数的效率】
函数的效率1、用宏定义来替换一些简单的函数以提高效率很明显,这不行,宏定义坑太多,例如上次讲到的运算符优先级问题,就算加了括号还有其他问题,例如如果你是循环迭代调用#define SQUARE(x) ((x)*(x))...int i=0;while(i<=100){ printf("%d\n",SQUARE(i++));//自己试试打印出来是啥,为什么?}.........原创 2022-06-05 19:20:53 · 94 阅读 · 0 评论 -
C语言的宏定义
宏定义默认全部用大写字母,以示与普通变量的区分开始从你定义开始#define PI 3.14结束默认到程序结束时结束,可以提前结束,用#undef PI宏定义的嵌套#define R 12#define PI 3.14#define S PI*R*R带参数的宏定义作用与函数类似,但是没有函数那么聪明,他是机械的替换,为了避免因运算符优先级问题造成错误,用宏定义计算的时候尽量加小括号#define MAX(x,y) ((x>y)?(x):(y))不加括号问题举例#原创 2022-06-05 19:04:55 · 113 阅读 · 0 评论 -
C语言动态内存管理
C语言内存管理四大函数1、malloc函数语法:malloc(你要申请内存空间的大小),默认返回void*型指针,不过为了方便看,返回时转换一下类型char * ptr;ptr = (char *)malloc(sizeof(char)*4);由于malloc函数不会帮你初始化申请的空间,所以需要你自己去初始化,也可以使用(string.h)库函数memset(void*,void,sizeof())进行初始化也可以用2、calloc函数语法与malloc完全一样,唯一的区别就是calloc原创 2022-06-04 22:12:45 · 85 阅读 · 0 评论 -
C语言的指针函数
可变参数函数可变参数函数需要特定头文件,有特定的格式,请看下例:#include <stdio.h>#include <stdarg.h>//首先引用特定头文件//写一个求和函数int sum(int n,...);//声明&定义 n表示参数个数 ...表示参数不定int sum(int n,...){ int i,sum=0; va_list vap;//加载参数列表 va_start(vap,n);//打开参数列表 for(i=0;i<n;i+原创 2022-05-26 17:29:25 · 151 阅读 · 0 评论 -
递归的应用
递归函数递归就是函数调用自己,要设置退出条件,否则会一直运行直到耗尽内存空间递归的应用1汉诺塔贴一下用python写的汉诺塔代码,思想是一致的,聪明的你肯定会把他写成C语言的代码吧,所以我就不贴代码咯。汉诺塔代码实现递归的应用2快速排序基本思想:分而治之找一个基准数值(随便定一个,习惯是数组中间那个数),分别从左到右寻找大于基准点的数(i是下标)和从右到左寻找小于基准点的数(j是下标),然后令两个数互换,当i超过j时退出循环,此时数组分为两段,左边全部比右边小,然后对两端数组进行递归直到各原创 2022-05-21 16:38:40 · 270 阅读 · 0 评论 -
函数与参数
函数C语言的函数需要先声明后定义再使用声明(养成良好习惯,写好函数声明)返回值类型 函数名(参数列表);函数声明末尾分号别忘了。定义返回值类型 函数名(参数列表){ 函数体;}其中返回值类型没有就写void,不写默认返回整型,没有参数可以不写,括号必须写,函数末尾没有分号使用像调用库函数一样写函数名(参数)就行函数名(参数);注意这里的参数是用户传入的实参,上面定义是形参函数参数和指针1、传值void swap(int x,int y){ int temp; t原创 2022-05-20 18:13:46 · 64 阅读 · 0 评论 -
常量与常量指针
常量一般常量数字,字符,字符串当用const修饰变量后可以把变量变为常量const double pi = 3.14;pi = 3.1415926;//如果你想修改值pi,则会报错指向常量的指针由上可知:用const修饰的指针就是指向常量的指针,不可通过解引用来修改其值。const int a = 520;const int *p = &a;*p = 123;//会报错但是此时可以修改指针p的指向。与之相反,有常量指针意为指针的指向不可改变,如果其指向的是变量则可改变其值原创 2022-05-19 18:16:45 · 60 阅读 · 0 评论 -
特殊指针的一些应用
指针指针和多维数组指针索引和数组下标索引作用相同int a[2][3]={{1,2,3}, {4,5,6}};int (*p)[3] = a;则a[1][2]==*(*(a+1)+2)==*(*(p+1)+2)==6void指针void指针可以指向任意数据类型,可以用来在任意类型指针之间转换,但是不能直接对void指针解引用。int a = 110;int *pa = &a;char *b = 'bbb';void p;//报错,不能用void 定义变量void *原创 2022-05-17 16:09:42 · 52 阅读 · 0 评论 -
指针数组&数组指针
指针数组本质是储存指针的数组数组指针本质是指向数组的指针原创 2022-05-14 19:05:30 · 76 阅读 · 0 评论 -
字符处理函数
C语言字符库函数string.h函数使用1.strlen(str*)这个函数功能是读取字符串的长度,读到第一个’\0’结尾。不包含’\0’,注意与sizeof区分。返回值是一个无符号整数,所以比较字符串大小用大于小于,不要相减看正负。...原创 2022-05-14 11:28:54 · 87 阅读 · 0 评论 -
ubantu中gcc编译C语言小问题
if else问题与字符的表达式括号中的判断最好不要写成'a'<=ch<='z'反正我那个版本是不行的,用个if else不能正常运行第二个判断最好写成这样'a'<=ch && ch<='z'这是测试代码,这样能正常运行ubantu版本20.04...原创 2022-04-30 15:14:54 · 743 阅读 · 0 评论 -
scanf()函数与getchar()巅峰相见
继上一篇关于getchar()的文章如果你知道要输入的数字个数可以直接用for循环+scanf()读入原创 2021-12-28 15:07:59 · 525 阅读 · 0 评论 -
关于getchar()吞我字符那些事
关于getchar()吞我字符那些事原创 2021-12-23 13:44:21 · 2514 阅读 · 1 评论 -
函数传递参数的三种情况
函数传参数我们来写一个两个数交换的函数帮助理解:#include <stdio.h>void myswap1(int x,int y){ int t; t = x; x = y; y = t;}void myswap2(int *p1,int *p2){ int t; t = *p1; *p1 = *p2; *p2 = t;}void myswap3(int &x,int &y){ int原创 2021-12-12 22:54:03 · 244 阅读 · 0 评论 -
C语言结构体?看了这个应该就行了^_^
结构体可以把他看做一个数组,不过数组储存的是数据类型一样的,而结构体则可以储存各种数据类型包括结构体类型也就是结构体嵌套。基本用法声明struct是声明结构体的关键字,加上结构体的名字:struct boy{ int num; char name[100]; char sex; int age; char addr[100];};这是声明一个名为boy的结构体,包括学号,姓名等等数据。声明后struct boy的作用就相当于int ,float一样。原创 2021-12-11 12:45:37 · 346 阅读 · 0 评论 -
C语言格式化输出输入
初学者必看原创 2021-12-07 15:48:22 · 1635 阅读 · 1 评论 -
C语言变量作用域
一、变量的作用域(空间)1、代码块作用域在{}里面属于一个代码块,如下i1,i2互不影响{ i = 1;//i1 { i=2;//i2 }}2、文件作用域任何在代码块之外的声明,从声明到文件结束都可访问,函数也具有文件作用域。int i;int main(){}3、原型作用域函数定义时,只在定义起作用void func(int array[],int length);4、函数作用域适用于goto语句,只能在函数内部跳转二、变量的原创 2021-08-19 12:08:49 · 297 阅读 · 0 评论 -
常量指针相关
一、写法const int *a 和 int const* a 表示的意思一样,都表示一个指向const int类型的指针语句错误案例…… const int num = 520; int *p = #……在赋值、初始化或参数传参的过程中,赋值号左边的类型应该比右边的类型限定更为严格,或至少是同样严格。在这里,使用指针 p,就可能间接地绕过 const 设定的防线。比如你可以通过指针改变num的值。编译器只能提出警告,不会报错。在对void原创 2021-07-28 11:11:52 · 71 阅读 · 0 评论 -
C语言之主函数的参数
main有参数吗?我们以前都是写的这样的#include <stdio.h>void main(){......}或者是这样的#include <stdio.h>int main(void){...... return 0;}实际上,main 函数是可以带参数的,这个参数可以认为是 main 函数的形参(形式参数)。C 语言规定 main 函数的参数只能有两个,习惯上把这两个参数写为 argc 和 argv。C 语言还规定C语言还规定了arg原创 2021-07-20 08:51:45 · 4724 阅读 · 2 评论 -
各种方式打印乘法表!?
芜湖!原创 2021-07-02 11:35:11 · 80 阅读 · 0 评论