
C
always@(posedge)
这个作者很懒,什么都没留下…
展开
-
【C】20.链接过程介绍
链接器每个C语言源文件被编译后都生产目标文件,这些文件最终通过链接器生成最终的可执行程序。链接器的主要作用是把各个模块之间相互引用的部分处理好,是得各个模块之间能够正确的衔接。两种链接方式静态链接 动态链接静态链接由链接器在链接时将库的内容直接加入到可执行程序中Linux 下静态库的创建和使用编译静态源码gcc -c lib.c...原创 2019-12-26 22:41:56 · 144 阅读 · 0 评论 -
【C】46.函数与宏分析
函数与宏宏是由预处理器直接替换展开的,编译器不知道宏的存在 函数是由编译器直接编译的实体,调用行为由编译器决定 多次使用宏会导致最终可执行程序的体积增大 函数是跳转执行的,内存中只有一份函数体存在 宏的效率比函数高,因为是直接展开,无调用开销 函数调用时会创建活动纪录,效率不如宏#include <stdio.h>#define RESET(p, le...原创 2019-12-25 19:35:53 · 123 阅读 · 0 评论 -
【C】6. 分支语句
if 语句分析if 语句用于根据条件选择执行语句 else 不能独立存在且总是与它最近的 if 相匹配(else 往前看找 if) else 语句后可以接连其它 if 语句if 语句中零值比较的注意点bool 型变量应该出现于条件中,不要进行比较 变量和 0值比较时, 0 值应该出现在比较符号左边 float 型变量不能直接进行0 值比较,需要定义精度bool...原创 2019-12-21 16:37:09 · 138 阅读 · 0 评论 -
【C】7.循环语句
循环语句的基本工作方式通过条件判断是否执行循环体 条件表达式遵循 if 语句表达式的原子do, while, for 的区别do 语句先执行后判断,循环体至少执行一次 while 语句先判断后执行, 循环体可能不执行 for 语句先判断后执行,相比 while 更简单//表示执行一次循环体do{ }while(0)Condition满...原创 2019-12-21 14:23:11 · 133 阅读 · 0 评论 -
【C】33. main函数与命令行参数
main 函数的概念C语言中 mian 函数称为主函数 一个C程序是从 main 函数开始的下面的写法都正确,但是最后一种是标准形式main(){}void main(){}int main(){}int main(){ return 0;}思考:为什么C编译器支持那么多 main 函数原型?这么多种形式也有历史原因,编...原创 2019-12-20 23:06:01 · 325 阅读 · 0 评论 -
【C】11.enum, sizeof, typedef 分析
enum的使用方法是C语言中的一种自定义类型, 可以根据需要自定义的整型值 第一个定义的enum值默认为0(在不赋值的情况下), 在默认的情况下是在前一个定义的基础上加1; 它的变量只能取定义时的的离散值;enum Color{ GREEN, RED = 2, BLUE};enum Color c = GREEN;printf("%d\n", c)...原创 2019-12-15 12:04:56 · 162 阅读 · 0 评论 -
【C】14.单引号和双引号
单引号和双引号C语言的单引号用来表示字符字面量 C语言的双引号用来表示字符串字面量'a' 表示字符字面量,在内存中占一个字节, ‘a’ + 1 表示 ‘a’ 的 ASCII 码加1,结果为 ‘b’ "a" 表示字符串字面量,在内存中占2个字节, “a”+1 表示指针运算,结果为指向“a”结束符 ‘\0’分析下面的合法性#include <stdio.h>...原创 2019-12-14 23:30:42 · 846 阅读 · 0 评论 -
【C】9.const和volatile分析
const 关键字const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用const修饰的变量不是真的常量,只是告诉编译器该变量不能出现在赋值符号的左边const 全局变量的分歧现代编译器中(比如GCC),修改const全局变量将导致程序崩溃, 因为它存储于...原创 2019-12-14 14:58:35 · 146 阅读 · 0 评论 -
【C】8. goto 和 void 分析
goto 分析现代软件工程中禁止用goto语句goto副作用程序分析#include <stdio.h>void func(int n){ int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof(int)...原创 2019-12-14 09:53:07 · 145 阅读 · 0 评论 -
【C】5.变量的属性
变量的属性C语言的变量可以有自己的属性 在定义变量的时候可以加上 “属性” 关键字 “属性”关键字指明变量的特有意义语法:property type var_nameauto 关键字auto c语言中局部变量的默认属性 表明被修饰的变量存储在栈上, 编译器默认所有的局部变量都是autovoid f(){ int i; // 局部变量默认属性为 au...原创 2019-12-13 23:35:02 · 140 阅读 · 0 评论 -
【C】4.类型转换
C语言中的数据类型可以进行转换强制类型转换 隐式类型转换long l = 100;int i = (int)l; // 强制类型转换 short s = 100;int i = s; // 隐式类型转换强制类型转换语法(Type)var_name(Type)value强制类型转换结果目标类型能够容纳目标值:结果不变 目标类型不能容...原创 2019-12-13 14:12:17 · 332 阅读 · 0 评论 -
【C】2.有符号和无符号
数据类型的最高位用于标识数据的符号最高位为1表示这个数为负数 最高位为0表示这个数为正数#include <stdio.h>int main(){ char c = -5; short s = 6; int i = -7; printf("%d\n", ( (c & 0x80) != 0 )); printf("...原创 2019-12-12 22:37:18 · 183 阅读 · 0 评论 -
【C】1.基本数据类型
数据类型可以理解为固定内存大小的别名 数据类型是创建变量的模子用模子 “咔咔咔” 创建很多变量变量的本质:是一段实际连续存储空间的别名; 程序通过变量来申请并命名存储空间; 通过变量的名字可以使用存储空间。 C ++中能对a这段内存取别名(引用)类型与变量的关系#include <stdio.h>int main(){ cha...原创 2019-12-12 18:41:17 · 155 阅读 · 0 评论 -
【C】16.位运算符分析
C语言中的位运算符位运算符直接对 bit 位进行操作,其效率最高左移和右移注意点左操作数必需为整数类型 右操作数的范围必需为:【0,31】 左移运算符 << 将运算符的二进制位左移动 右移运算符 >> 把运算符的二进制位右移动char 和short 被隐士转换为 int 后进行移位操作 如果出现负数(-1)的情况编译厂家不同,结果不同 规则...原创 2019-12-12 15:25:13 · 183 阅读 · 0 评论 -
【C】43.函数的意义
函数的由来函数的目的去实现算法函数的意义模块式程序设计C语言中的模块化面向过程的程序设计面向过程的程序设计方法是以一种以过程为中心的编程思想 首先将复杂的问题分解为一个个容易决绝的问题, 分解后的问题可以按照步骤一步一步完成。 函数是面向过程在C语言中的体现 解决问题的每个过程可以用函数来实现函数的声明和函数的定义声明的意义在于告诉...原创 2019-12-08 23:00:35 · 195 阅读 · 0 评论 -
【C】36.函数与指针分析
函数类型C语言中函数有自己特定的类型int add(int i, int j)的类型为 int(int,int)函数的类型有返回值,参数类型和参数个数共同决定 C语言中通过typedef为函数类型重命名typedef type name(parameter list)eg: typedef int f(int, int);函数指针函数指针用于指向一个函数 函...原创 2019-12-07 15:11:11 · 115 阅读 · 0 评论 -
【C】35.数组参数和指针参数分析
思考为什么C语言的数组参数会退化为指针?原因传递参数时如果拷贝整个数组效率会很低(比如还要遍历整个数组之类的,而指针只要四字节) 参数位于栈上,太大的数组拷贝会将导致栈溢出(函数的参数总是位于函数调用栈上的,如果此时参数数值非常大的的话,会导致栈溢出)C语言早期是开发unix的C语言中只会以值拷贝的方式传递参数(实参的值拷贝到形参)当向函数传递数组时(将数组明看作常量指针,...原创 2019-12-06 23:28:53 · 140 阅读 · 0 评论 -
【C】34.多维数组和多维指针
指向指针的指针指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值int i = 0;int* p = NULL;int** pp = NULL;pp = &p;*pp = &i;需要指向指针的指针的原因:指针本质上也是变量 对于指针也存在传值调用和传址调用实例分析:重置动态内存空间(工程实际项目抽象案...原创 2019-12-05 22:48:03 · 191 阅读 · 0 评论 -
【C】32.数组指针和指针数组分析
思考:下面的声明合法吗?int array[5];int matrix[3][3];int* pa = array; // 数组名就是首元素地址,int类型,pa是int类型,合法!int* pm = matrix;// ?array 代表数组首元素的地址,那么 matrix 代表什么?array 和 &array 的地址值相同,但意义不同,那么它们所代表的类型相同...原创 2019-12-04 21:58:08 · 131 阅读 · 0 评论 -
【C】29.指针和数组分析
问题:数组名可以当作常量指针使用,那么指针是否也可以当作数组名使用?下标形式访问元素int a[10] = {0};a[1] = 3;a[2] = 5;指针形式访问元素int a[10] = {0};*(a+1) = 3;*(a+2) = 5;下标形式 VS 指针形式指针以固定增量在数组中移动,效率高于下标形式 指针增量为 1 ,且硬件具有硬件增...原创 2019-12-01 21:51:38 · 143 阅读 · 0 评论 -
【C】28.指针和数组分析
回顾数组是一段连续的内存空间 数组的空间大小为 sizeof(array_type) * array_size 数组名可以看作指向数组第一个元素的常量指针问题:a+1的意义是什么?结果是什么? 指针运算的意义是什么?结果是什么?编程分析 a+1 示例#include <stdio.h>int main(){ int a[5] = {0}; ...原创 2019-12-01 15:01:49 · 157 阅读 · 0 评论 -
【C】27.数组的本质分析
数组的概念数组是相同类型变量的的有序集合,在一片连续的的内存空间中存储元素。数组示意图:数组包含5个int类型的数据数组中的元素没有名字 数组名代表首元素的地址数组的大小数组在一片连续的内存空间中存储元素。数组元素的个数可以显示或隐式指定。int a[5] = {1, 2}; // 显示指定个数int b[] = {1, 2}; // 隐式指定...原创 2019-12-01 10:42:51 · 134 阅读 · 0 评论 -
【C】26.指针的本质分析
问题:程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间? int i = 5; int* p = &i; printf("%d, %p\n", i, p); *p = 10; printf("%d, %p\n", i, p);上述程序 通过指针变量 p 修改了 程序变量 i ...原创 2019-11-30 14:49:59 · 493 阅读 · 0 评论 -
【C】25.# 和 ## 操作符使用分析
# 介绍#include <stdio.h>#define STRING(x) #xint main(){ printf("%s\n", STRING(Hello world!)); printf("%s\n", STRING(100)); printf("%s\n", STRING(while)); printf("%s\...原创 2019-11-29 15:52:03 · 123 阅读 · 0 评论 -
【C】24.#pragma 使用分析
#pragma一般用法#pragma parameter不同的 parameter 参数语发和意义不相同, 不同编译器对它有不同的编译方式.,#pragma message#pragma message 与 #error 和 #waring 不同,它仅代表一条编译消息,不代表程序错误。#include <stdio.h>#if defi...原创 2019-11-28 16:29:31 · 152 阅读 · 0 评论 -
【C】23. #error 和 #line 使用分析
#error分析#error 用于生成一个编译错误信息用法:#error messagemessage 不需要用双引号包围#error 是一种预编译器指示字,可以提示编译条件是否满足。(编译过程中任意错误信息意味着无法生成最终稿的可执行程序)#include <stdio.h>#ifndef __cplusplus #error This...原创 2019-11-27 16:36:17 · 134 阅读 · 0 评论 -
【C】22.条件编译使用
条件编译#if#else#endif条件编译的行为类似与C语言中的 if ... else ...条件编译器是预编译指示命令,用于控制是否编译某段代码。// #include <stdio.h>#define C 1int main(){ const char* s; #if( C == 1 ) s = "This i...原创 2019-11-26 23:09:16 · 121 阅读 · 0 评论 -
【C】21.宏定义与使用分析
#define介绍#define是预处理处理的单元实体之一。定义的宏可以出现在程序的任意位置,定义之后代码都可以使用这个宏。预处理器不会进行语法分析的(直接进行文本替换),后面的编译器才进行语法分析,这个过程很容易产生歧义错误。#define 定义的宏常量可以直接使用#define 定义的宏常量本质为字面量#define ERROR -1#define PAT...原创 2019-11-25 23:28:35 · 395 阅读 · 0 评论 -
【C】31.字符串经典问题分析
案列一:分析下面程序,程序输出是什么?#include <stdio.h>int main(){ char buf[10] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src); printf("buf = %s\n", buf); ...原创 2019-11-23 16:30:50 · 187 阅读 · 0 评论 -
【C】30.C语言中的字符串
C中字符串概念字符串 是有序字符的集合(是程序中基本元素之一)C语言中没有字符串的概念C语言中通过特殊的字符数组模拟字符串(特殊的字符数组是有 \0 作为结尾)C语言中字符串都是以 \0 结尾的的字符数组'\0' 介绍:'\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在...原创 2019-11-20 16:47:32 · 468 阅读 · 0 评论 -
【C】14.单引号和双引号
字符字面量(单引号)被编译为对应的ASCII码(单个字符代表整数 %d)字符串字面量(双引号)被编译为对应的内存地址(字符代表字符指针)char* p = 1;Char* p=’1’Char* p=”1”;//低地址空间,不能随意访问上图低于圈出来的是低地址,不能随意访问 通常字符串字面量的地址都是大于那个值的(即是有个合法的地址)#include <...原创 2019-09-27 17:26:43 · 559 阅读 · 0 评论 -
【C】42.内存操作相关问题分析二
常见的内存错误:结构体成员指针未初始化。结构体成员指针未分配足够的内存。内存分配成功,但未初始化。内存操作越界。#include <stdio.h>#include <malloc.h>struct Demo{ char* p;};int main(){ struct Demo d1; // 没初始化有问题 s...原创 2019-11-05 10:08:43 · 112 阅读 · 0 评论 -
【C】41.内存操作相关问题分析一
野指针:指针变量中的值是非法的内存地址,进而形成野指针。野指针不是NULL指针,是指向不可用内存地址的指针。NULL指针并无危害,很好判断也很好调试。C语言中无法判断一个指针保存的地址是否合法野指针的由来:局部指针变量没有被初始化。指针所指向的变量在指针之前被销毁。使用已经释放的过的指针。进行了错误的指针运算。进行了错误的强制类型转换。#inclu...原创 2019-11-05 09:58:30 · 105 阅读 · 0 评论 -
【C】39.程序中的三国天下
程序中的三国天下是介绍:栈, 堆, 静态存储区栈区主要保存函数调用时所需要的参数信息.局部变量等信息,还包括一些看不到的返回地址,寄存器信息等等(可以说没有栈程序就没法运行)。栈就是一种行为,后进先出的行为。(栈是是为了函数调用)。esp : 栈顶指针ebp : 函数调用返回地址指针每次新的活动记录对应的栈地址地址都不是固定的,这样保证了程序的安全性。...原创 2019-10-29 19:22:59 · 152 阅读 · 0 评论 -
【C】15.逻辑运算符
程序运行后的结果是?int i = 0;int j = 0;int k = 0;++i || ++j && ++k从左向右的规则#include <stdio.h>int g = 0;int f(){ printf("In f()...\n"); return g++;}int main(){ i...原创 2019-09-26 11:33:20 · 102 阅读 · 0 评论 -
【C】10.struct 和 union 分析
struct 可以看做变量的集合// 空结构体占用内存大小struct ST{};sizeof("%d\n", sizeof(struct ST));// gcc 环境编译下大小为0// bcc 环境下大小为 1//两款编译器理解不一样#include <stdio.h>#include <malloc.h>struct SoftArra...原创 2019-09-25 09:56:58 · 103 阅读 · 0 评论 -
【C】38.动态内存分配
程序运行过程中,可能需要使用一些额外内存空间,通过malloc向操作系统申请内存,满足额外的内存空间。malloc所分配的是一块连续的的内存,它以字节为单位,并且不带任何的类型信息。free用于动态内存归还系统。Malloc 申请的内存一般比自己想要的多,不同平台下结果是不一样的一个嵌入式上面开发的案列:malloc是库函数,在嵌入式设备直接在里面修...原创 2019-10-28 23:46:54 · 164 阅读 · 0 评论