C语言
yuyijie_1995
半路出家菜鸡程序员一枚
展开
-
C指针进阶
文章目录读指针看见指针立刻要想明白的几件事指针的类型指针所指向的类型指针的数值(就是打印指针能得到的)指针本身所占据的内存区(指针自己的地址)指针运算&和*指针表达式指针和数组的关系字符数组部分指针和结构类的关系指针类型转换指针安全问题读指针看见带*的变量名字或者函数名字,都是首先从名称开始(不管其他的符号),然后看其他符号的优先级,这里注意[ ]和()的优先级都是是高于*的,另外没...原创 2019-12-08 22:09:41 · 128 阅读 · 0 评论 -
IO缓冲区
为了协调cpu和io设备(键盘,显示器)速度不协调,提出IO缓冲区。getchar()是一个阻塞函数调用fputs的时候其实写入的是缓冲区,调用fclose的时候才真正写入到设备如果我们希望数据不写入缓冲区,而是直接进入设备,则需要用到fflush立刻刷新缓冲区,立刻将缓冲区的数据存入目标位置修改缓存模式的方法使用函数setvbuf()程序戛然而止并没有将所有的输出都打印...原创 2019-11-20 14:15:37 · 588 阅读 · 0 评论 -
标准流和错误处理
文章目录标准流错误处理标准流当一个程序被执行的时候,C语言会自动打开三个面向终端的文件流printf打印的时候就是向标准输出写入scanf就是向标准输入写入报错的输出就是标准错误输出当文件打开错误时候,将信息输出到标准错误输出流FILE *fp;if((fp=fopen("notexit.txt","r"))==NULL){fputs("fail to open\n",st...原创 2019-11-20 13:58:08 · 596 阅读 · 0 评论 -
文件操作
文章目录打开和关闭文件读取和写入格式化读写文件二进制读写文件随机读写文件打开和关闭文件linux万物皆文件概念文本文件和二进制文件看得懂的就是文本文件,由一些字符的序列组成,另一种是二进制文件,通常是指除了文本文件之外的文件。注意:在完成对一个文件的读写操作后,必须将其关闭!fopen和fclose注意这里打开模式是双引号,不是字符fopen传入参数FILE结构的文件指...原创 2019-11-20 13:28:48 · 313 阅读 · 0 评论 -
位操作
C语言并没有规定一个字节的尺寸文章目录逻辑位运算符和赋值号结合位域移位和位操作的应用左移右移和赋值号结合未定义行为掩码逻辑位运算符只作用于整型,对操作数中的每个二进制位起作用反与异或^或和赋值号结合四个运算符,除了按位取反只有一个操作数之外,其他三个都可以与赋值号结合到一块,使得代码更加简洁int mask=0xFF;int v1=0xABCDEF;//0x表示...原创 2019-11-20 10:24:10 · 168 阅读 · 0 评论 -
枚举类型
为什么要使用枚举?让数值拥有名字比如#define PI 3.14一次能定义多个常量使得我们不必使用很多个define来进行定义,比如处理问题时与星期几有关系,需要将星期一转换为数字1,,以此类推,如果用define来定义的话,需要#define MON 1#define TUS 2...比较繁琐,要是定义月份则需要12个define如果使用enum就非常方便enum w...原创 2019-11-20 09:50:53 · 134 阅读 · 0 评论 -
typedef
文章目录进阶typedeftypedef最初的用途就是希望C语言能用与其他语言相同的关键字定义变量#include<stdio.h>typedef int integer;//后面要加封号 int main(void){ integer a; int b; a=520; b=a; printf("%d",b); retur...原创 2019-11-13 21:29:30 · 149 阅读 · 0 评论 -
内存池
文章目录内存碎片12kb的A被释放后,会出现支离破碎的内存空间解决方法就是创建一个内存池,让程序额外维护一个缓存区域不再是直接free释放A,而是把A扔到内存池中。下次再生产D,直接从内存池中拿出来合适的垃圾内存块来进行使用。...原创 2019-11-13 16:34:27 · 64 阅读 · 0 评论 -
单链表
文章目录单链表尾插法搜索节点实战训练从一个错误的嵌套结构体开始入手struct Test{int x;int y;struct Test test;};会陷入无限的递归出现段错误struct Test{int x;int y;struct Test *test;//变成指针之后就不会报错};变成指针以后就不会循环了,因为这个语句的意思只是声明了一个指针,而不是无...原创 2019-11-13 16:27:51 · 330 阅读 · 0 评论 -
结构体变量作为函数的参数和返回值
文章目录结构体作为参数或者返回值传递指向结构体变量的指针动态申请结构体构建一个图书馆传递结构体变量结构体变量可以相互赋值么#include<stdio.h>int main(){struct Test{int x;int y;}t1,t2;t1.x=3;t1.y=4;t2=t1;return 0;}说明两个结构体之间是可以相互赋值的,结构体作为参数...原创 2019-11-11 10:58:22 · 4190 阅读 · 0 评论 -
结构体数组和结构体指针
文章目录结构体嵌套结构体数组初始化结构体数组结构体指针指针访问成员方法结构体嵌套比如上篇博客的代码struct Book{ char title[128]; char author[40]; float price; unsigned int date; char publisher[40]; };可以把date单独再定义成一个结构体...原创 2019-11-10 19:06:52 · 877 阅读 · 0 评论 -
结构体
文章目录结构体声明定义结构体类型变量访问结构体变量初始化结构体变量初始结构体的指定成员值结构体内存一个基本数据类型无法解决的问题,由结构体来完成。数组也可以存放多个数据,但是要求数据类型一致,所以无法使用。结构体声明struct 结构体声明{结构体成员1;结构体成员2;结构体成员3;...};struct Book{char title[128];char autho...原创 2019-11-10 16:50:29 · 219 阅读 · 0 评论 -
内联函数
文章目录内联#和##重要! 可变参数宏定义内联用于解决程序中函数调用的效率问题只要在函数的定义之前加上inline关键字原理和宏定义展开类似,直接将函数的定义在内联处进行展开相比普通函数,少了"跳来跳去的过程",也省去了申请栈空间的过程#和##1.#和##都是预处理运算符2.在带参数的宏定义中,#运算符后面应该跟一个参数,预处理器会把这个参数转换为一个字符串利用这种方法...原创 2019-11-10 14:46:55 · 106 阅读 · 0 评论 -
宏定义的高级用法
文章目录不带参数的宏定义带参数的宏定义不带参数的宏定义#define PI 3.14所有PI都替换为3.14宏定义名字约定俗成为大写宏定义在编译之前进行替换,而编译工作的任务之一就是语法检查,所以编译器不会对宏定义进行语法检查宏定义不是说明或者语句,在末尾不必加分号宏定义的作用域是从定义的位置开始到整个程序结束可以用#undef来终止宏定义的作用域宏定义允许嵌套例子...原创 2019-11-10 14:24:48 · 535 阅读 · 1 评论 -
C语言内存布局
文章目录常见变量的地址常见变量的地址bf比80要高得多测试代码#include<stdio.h>#include<stdlib.h>int *func(void){ int *ptr=NULL; ptr=(int*)malloc(sizeof(int)); if(ptr==NULL) { ...原创 2019-11-07 12:52:55 · 86 阅读 · 0 评论 -
内存管理函数
文章目录动态内存管理mollocfree内存泄漏malloc申请一块任意尺寸的内存空间初始化内存空间动态数据扩展动态内存管理原来我们程序中要使用的变量都要提前定义好,不能在数组运行中才开始定义,后来C99出现了变长数组,能提高代码的灵活度,比如询问用户需要定义几个整型数据,得到答案后再定义所需要长度的整型数据。但局限性是该数组创建出来后便不能再修改。而动态内存管理就是在提高代码灵活度的同时又...原创 2019-11-06 13:47:38 · 393 阅读 · 0 评论 -
快排练习
#include <stdio.h>void quick_sort(int array[],int left,int right){ int temp; int i=left; int j=right; int pivot; pivot=array[(left+right)/2]; while (i<=j) { ...原创 2019-11-06 10:42:22 · 209 阅读 · 0 评论 -
递归
文章目录汉诺塔汉诺塔函数调用自身的行为#include <stdio.h>#include <stdlib.h>void recursion();void recursion(){ printf("HI\n"); recursion();}int main(){ recursion(); return 0;}递归必...原创 2019-11-06 10:13:04 · 146 阅读 · 0 评论 -
作用域和链接属性
文章目录生存域问题变量和声明链接属性生存域问题下面的代码会报错#include <stdio.h>#include <stdlib.h>void func(void);int main(void){ func(); count++; printf("In main,count=%d\n",count); retu...原创 2019-11-04 22:19:57 · 122 阅读 · 0 评论 -
C语言---指针函数和函数指针
指针函数返回值是一个指针,就称为指针函数,是一个函数#inlcude<stdio.h>char *getWord(char c){switch(c){case 'A':return "Apple";case 'B':return "Banana";case 'C':return "Cat";case 'D':return "Dog";default: return...原创 2019-10-28 18:50:22 · 1552 阅读 · 0 评论 -
C语言---函数
声明函数不需要写明传入参数的名字int max(int,int);所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。参数和返回值传值和传址传值无法在函数中修改main中变量的值传址会更合理#include <stdio.h>void swap(int *x,int *y);void s...原创 2019-10-28 15:47:52 · 117 阅读 · 0 评论 -
C语言----指针
注意 避免访问未初始化的指针可能会修改其他位置的内存的代码左值和右值左值指用于识别和定位一个存储位置的标识符。(注意:左值同时还必须是可以改变的)#include <stdio.h>int main(){ int a = 5; ++(a++); return 0;}这里(a++)是先将变量a的值(5)作为整...原创 2019-10-27 09:56:43 · 492 阅读 · 0 评论 -
C语言--数组&字符串
类型 数组名[元素个数]int a[6];C语言中数组不能动态定义,定义写在最开头的位置访问数组元素数组名[下标]a[0];初始化可以用scanf的方法对 &a[0] 赋值也可以批量初始化数组动态赋值的特殊情况! 可以用变量指定数组长度 a[n] 成立 如果n是一个常量的形式字符串用%s当做占位符...原创 2019-10-19 13:59:35 · 287 阅读 · 0 评论 -
C语言的一些函数
getchar()从标准输入流中读取下一个字符 用了这个之后就不用scanf了 ,getchar()本身就是输入函数 自动接收字符例子while(getchar()!='\n')只要用户输入的字符不是回车就继续输入scanf使用小窍门 当用户输入任意字符时, 结束打印putchar()从标准输出流中输出字符continueint main(){int i;while...原创 2019-10-18 19:31:29 · 112 阅读 · 0 评论 -
C语言变量注意点
基础知识输入/ 用于很长的输入,加在句尾可以换行,表示这一行和下一行在同一行打印。变量占位符double num=2.3333333333printf("%11.9f",num);//11表示总共占11位,.9表示小数点后9位变量由变量名和存储单元组成左对齐右对齐以及指数形式printf("%10.2f",3.13);/右对齐printf("%-10.3f",3....原创 2019-10-15 09:25:55 · 380 阅读 · 0 评论