![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
惜朝_
这个作者很懒,什么都没留下…
展开
-
预处理
宏定义预处理器直接对宏进行文本替换,宏使用时的参数不会进行求值和运算,预处理器不会对宏定义进行语法检查#define 定义的宏可以出现在程序的任意位置#define 定义之后的代码都可以使用这个宏(没有作用域限制) #define 表达式的使用类似函数调用 #define _DIM_(a) sizeof(a)/sizeof(*a)强大的内置宏 __FILE__ __LINE__ __DATE...原创 2016-11-26 20:08:13 · 177 阅读 · 0 评论 -
关于Cmake 链接静态库出现undefined reference to错误
在编写一个C++项目的时候,使用cmake管理工程,成功链接一个静态库,但是在编译时仍然出现undefined reference to 的错误。 最终发现问题是由于c和c++混编导致的。解决方案: 由于我链接的库是使用c语言编写,所以需要在include头文件时加上#ifdef __cplusplusextern "C"{#endif#include "XXX.h"...原创 2018-05-06 21:07:20 · 23653 阅读 · 1 评论 -
面向对象模型分析(继承,多态)
class是一种特殊的struct 在内存中 class 依旧可以看做变量的集合class 中的成员函数和成员变量是分开存放的 每个对象有独立的成员变量所有对象共享类中的成员函数#include <iostream>#include <string>using namespace std;class A{ int i; int...原创 2018-04-13 14:17:25 · 137 阅读 · 0 评论 -
读Linux内核kfifo
内核kfifo简约高效,匠心独运,有一下特点:保证缓冲区大小为2的次幂,不是的向上取整为2的次幂。使用无符号整数保存输入(in)和输出(out)的位置,在输入输出时不对in和out的值进行模运算,而让其自然溢出,并能够保证in-out的结果为缓冲区中已存放的数据长度。将需要取模的运算用 & 操作代替( a % size = (a & (size − 1)) ), 这需...原创 2018-04-12 09:25:32 · 1079 阅读 · 0 评论 -
C99 可变数组LVA
C90及C++的数组对象定义是静态联编的,在编译期就必须给定对象的完整信息。但在程序设计过程中,我们常常遇到需要根据上下文环境来定义数组的情况,在运行期才能确知数组的长度。对于这种情况,C90及C++没有什么很好的办法去解决(STL的方法除外),只能在堆中创建一个内存映像与需求数组一样的替代品,这种替代品不具有数组类型,这是一个遗憾。C99的可变长数组为这个问题提供了一个部分解决方案。可变长数...转载 2018-03-26 17:23:21 · 349 阅读 · 0 评论 -
printf输出带颜色字符串
printf("\033[字背景颜色;字体颜色m字符串\033[0m" );颜色代码:QUOTE:字背景颜色范围: 40--49 字颜色: 30--39 40: 黑 30: 黑 41: 红 ...原创 2018-03-22 09:07:16 · 1384 阅读 · 0 评论 -
变量默认初始化问题
全局变量,静态变量(局部/全局) 不初始化,默认初始化为0int a;int main(){ static int b; std::cout << a; //0 std::cout << b; //0}局部变量 不初始化, 则为随机数int main(){ int a; std::cout <...原创 2018-03-20 12:32:10 · 854 阅读 · 0 评论 -
动态内存分配
动态内存分配C语言中一切操作都是基于内存的变量和数组都是内存的别名内存分配由编译器在编译期决定定义数组的时候必须指定数组长度数组长度是在编译器就必须确定的程序在运行的过程中,可能会使用一些额外的内存空间,需要通过malloc 和 free malloc所分配的是一块连续内存,以字节为单位,并且不带任何的类型信息 malloc实际分配的内存可能会比请...原创 2018-03-20 12:31:19 · 174 阅读 · 0 评论 -
递归函数
递归函数是一种数学上分而治之的思想递归需要边界条件 当边界条件不满足是,递归继续进行 当边界条件满足时,递归停止 递归函数必须有递归出口,无限递归会导致程序栈溢出而崩溃 示例代码//求字符串长度#include <stdio.h>int strlen_r(const char* s){ if( *s ) ...原创 2018-03-20 12:30:33 · 226 阅读 · 0 评论 -
函数参数(可变参数)
函数参数函数参数在本质上和局部变量相同在栈上分配空间函数参数的初始值是函数调用时的实参值函数参数的求值顺序依赖于编译器的实现int k = 1;printf("%d, %d \n",k++,K++);//gcc 编译器输出 2,1//这个是不确定的顺序点程序中存在一定的顺序点顺序点是执行过程中修改变量值的最晚时刻在程序到达顺序点的时候,之前所做的一切操作...原创 2018-03-20 12:29:59 · 267 阅读 · 0 评论 -
野指针(内存操作的问题及规范
函数指针- 指针变量中的值非法的内存地址,进而形成野指针 - 野指针不是NULL指针,是指向不可用内存地址的指针 - C语言无法判断一个指针所保存的地址是否合法野指针的由来局部指针变量==没有初始化==指针所指向的变量==在指针之前被销毁==使用已经释放过的指针进行了错误的指针运算进行了==错误的强制类型转换==代码示例:#include <stdio...原创 2018-03-20 12:29:21 · 294 阅读 · 0 评论 -
多维数组和多维指针(数组参数和指针参数)
二维数组与二级指针二维数组在内存中以一维数组的方式排布int m[2][3] m的类型为int(*)[3]c语言中数组参数会退化为指针 数组参数 – 等效的指针参数 float a[5] – float* a int* a[5] — int** a char a[3][5] — char (*a)[5]多维数组参数...原创 2018-03-20 12:28:00 · 281 阅读 · 0 评论 -
数组指针和指针数组
数组的类型由元素类型何数组大小共同决定int array[5]的类型为 int[5],不是 int型c语言中为数组类型重命名typedef type(name)[size]typedef int(INTT5)[5]INTT5 iarray;数组指针数组指针用于指向一个数组数组名是代表数组首元素的地址,但是不是数组的起始地址,==通过取址符&作用于数组...原创 2018-03-20 12:27:02 · 130 阅读 · 0 评论 -
编译过程
编译过程: 预处理:处理注释,宏以及以#开头的符号 gcc -E filew.c -o file.i编译: 进行词法分析,语法分析和语义分析gcc -S file.i -o file.s汇编: 将汇编代码翻译为机器指令的目标文件gcc -c file.s -o file.o链接: 静态链接: 编译静态库源码 gcc -c lib.c -o lib.o 生成静态库文件ar -q ...原创 2016-11-26 20:07:06 · 257 阅读 · 0 评论 -
基本语法
函数 不写参数表示可以接受任意参数,不写返回类型则返回int. fun( ){ } 不带参数,无返回值 则应该这样写 void fun(void)不存在void变量,但是可以定义void类型的指针void* 做为作为左值可以接受任意类型的指针void* 作为右值使用时 需要强制转换const 并不是定义真正意义上的常量,只是使变量具有只读属性const 修饰的局部变量在栈上分配空...原创 2016-11-22 19:58:24 · 206 阅读 · 0 评论 -
数据类型
数据类型 可以理解为固定内存大小的别名;数据类型是创建变量的模子;变量其实是一段实际连续存储空间的别名;程序中通过变量来申请并命名存储空间;变量所在的内存大写取决于所属的数据类型;数据类型的最高位 为1 这个数为负数为0 这个数为正数计算机 内部使用补码表示 有符号数正数的补码的为正数本身;负数的补码为负数的绝对值各位取反加1;C语言中变量默认为有符号的类型;C语言中只有整数类型 可以声明un...原创 2016-11-20 13:00:25 · 259 阅读 · 0 评论 -
c语言堆空间生成二维数组
#include <stdio.h>#include <malloc.h>int** malloc2d(int row, int col){ int** ret = NULL; if( (row > 0) && (col > 0) ) { int* p = NULL; ret =...原创 2018-07-27 08:42:31 · 1125 阅读 · 0 评论