
C
学习笔记
Rookie on the road
这个作者很懒,什么都没留下…
展开
-
C语言中宏定义初始化结构体
在对结构体对象定义和初始化中,可以通过使用宏来快速达成结构,在使用过程中,应该注意宏参数名和结构体的成员名的冲突问题,宏参数名和结构体的成员名不能相同。typedef struct IIC_msg{ int addr; int len; char *msg; }fmsg_t;#define I2C1_ADDR 0x65#define I2C2_ADDR 0x35#define SIZE(arr) sizeof(arr)/sizeof(arr[0])#define I2C_C原创 2021-10-19 09:55:06 · 3870 阅读 · 0 评论 -
关于字符串的内存分布
char * globalHeader = "hello world";char globalArrayHeader[] = "hello world";void displayHeader(){ static char *staticHeader = "hello world"; char *localHeader = "hello world"; static char sta...原创 2019-11-11 13:41:18 · 294 阅读 · 0 评论 -
对于指针与数组
数组和指针的差别数组和数组指针在使用上有一些区别,本次使用的vector数组和pv指针定义如下:int vector[5] = {1, 2, 3, 4, 5}int *pv = vector;vector[i]生成的代码和*(vector+i)生成的不一样,vector[i]表示法生成的机器码从位置vector开始,移动i个位置,取出内容。而*(vector+i)表示法生成的机器码则是...原创 2019-11-10 21:34:29 · 167 阅读 · 0 评论 -
define中参数使用(#、##、...和__VA_ARGS__)
1. 用宏参数创建字符串:#运算符#define PUT_STRING(x) printf("the square of X is %d.\n ",((x)*(x)))原创 2019-10-29 09:54:13 · 1562 阅读 · 0 评论 -
关于setjmp和longjmp函数
现在可以讨论一下setjmp()和longjmp()的用途,因为它们是通过操纵过程活动记录实现的。许多程序员新手并不知道这个强大的机制,因为它是C语言所独有的。它们部分弥补了 C语言有限的转移能力。这两个函数协同工作,如下所示;setjmp(imp buf j)必须首先被调用。它表示“使用变量j记录现在的位置。函数返回零。longjmp(jmp bufj, int i)可以接着被调用。它表示“回...原创 2019-10-17 08:28:44 · 394 阅读 · 0 评论 -
关于可执行文件中的内存分段的那些事
对于可执行文件的内存,我们通过下面的程序来理解#include<stdio.h>int m; //0 0x404050 未初始化的数据段bssint n = 2; // 0x402000 数据段static int k; // ...原创 2019-10-16 16:20:03 · 278 阅读 · 0 评论 -
关于逗号运算符的影响--首次执行与再次执行的不同
在C语言中,有很多地方用到逗号运算符,如,数组元素赋值、枚举声明、单行多变量声明中都运用到。但是,其执行的效果可能有些不同,在数组元素赋值中,在最后一个元素的末尾加上一个逗号,如:char *atd[6] = {"hello world", "hi", "nice " " to", "meet", "you",};在上述程序中,在atd[2]和atd[...原创 2019-10-15 14:13:31 · 306 阅读 · 0 评论 -
一个数的每一位上的数字都是它的因数
问题描述:一个数的每一位上的数字都是这个数的因数如:128128 mod 1 =0128 mod 2 =0128 mod 8 =0那么你还知道有哪些数是这种特性的数呢?编程实现指定范围内的这种特性的数。#include<stdio.h>int l_,r_;void input_data(){ scanf("%d%d",&l_,&...原创 2019-10-14 13:51:02 · 208 阅读 · 0 评论 -
关于预定义宏
C标准规定了一些预定义宏,其具体演示如下://文件名:define_.cvoid function_f(){ printf("the date:%s\n",__DATE__); //预处理的日期 printf("the file:%s\n",__FILE__); //表示当前源代码文件名的字符串 printf("the line:%d\n",__LINE__); //表示当前源代...原创 2019-10-14 10:22:36 · 247 阅读 · 0 评论 -
C语言中的垃圾回收分析
C语言中的垃圾回收分析 摘要:C语言没有运行时库,无法自动压缩使用中的内存,缩小堆栈所需内存空间。若只申请内存,没有释放,势必造成系统内存不断减少、丢失。长时间的运行,最终导致系统死机。文章阐述了C语言垃圾产生的原因,并从引用计数、标记一清除算法两方面提出如何实现C语言的垃圾回收。 关键词:C语言;垃圾回收;引用计数;标记一清除算法 一般来说,操作系统记录了所有进程使用的全部资源,当系...转载 2019-10-12 16:04:53 · 968 阅读 · 0 评论 -
FSM----C语言
有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法。状态机实现的方式有多种,下面讲述三种.1.使用if/else if语句实现的FSM使用if/else if语句是实现的FSM最简单最易懂的方法,我们只需要通过大量的if /else if语句来判断...转载 2019-10-11 11:28:21 · 673 阅读 · 0 评论 -
多重选择---switch和break
switch语句switch ($value$){ $case$}程序根据value的值跳转到相应的case标签处,然后,执行余下的语句,如果遇到break语句,则跳出switch语句,执行switch后的语句。其中,value和case标签的值必须是整数值,标签必须是常量或完全由常量组成的语句,否则,会直接执行switch语句后的语句。如: switch(Input) { ...原创 2019-10-10 16:48:23 · 152 阅读 · 0 评论 -
C语言中按位运算符的应用
C语言中提供了按位逻辑运算符 '&' '|' '^' '~' 和移位运算符 ' >>' '<<'1. 按位与:&2. 按位或:|3. 按位异或:^4.按位取反:~5. 左移:<<6. 右移:>>应用: 1.掩码按位与(&)一般用于掩码(mask)。掩码主要是指对一些设置为1(开...原创 2019-10-08 16:43:28 · 1890 阅读 · 0 评论 -
对数据结构的认识
1.1结构的基本知识1.1.1结构声明形式:struct 结构标记{结构成员;}变量表;**结构标记:**结构标记可选的,用于为结构命名,在定义之后,结构标记可以代表花括号内的声明,可以作为该声明的简写形式。注意:结构标记、结构成员、普通变量(非成员) 可以采用相同的名字,他们之间不会冲突,同时,不同结构中的成员可以使用相同的名字(注:从编程风格上,一般使用相同名字的对象其密切相关)...原创 2019-09-09 14:22:55 · 399 阅读 · 0 评论 -
C语言内存对齐
内存对齐对齐原则:1. 结构(struct)(或联合(union))体的数据成员,第一个数据成员放在offset为0的地方,如果第一个数据成员为某个复合结构的子成员,则要根据子成员的类型存放在对应的整数倍的地址上。2. 结构体成员按自身长度 “ 自然对齐 ”(自然对齐:指的是该成员的起始位置的内存地址必须是它自身长度的整数倍)。如果结构体作为成员,则需要找到这个结构体中的最大的元素,然后从这...原创 2019-09-06 09:37:38 · 113 阅读 · 0 评论 -
enum类型
enum类型enum类型是一种特殊的类型,他的值包含在一个命名的常量集合中。这些常量称为枚举符。枚举说明符: enum 标识符 opt { 枚举符表}; enum 标识符枚举符表: 枚举符 枚举符表,枚举符枚举符: 标识符 标识符 = 常量表达式说明:枚举变量同struct和union一样,可以使用不同的方式说明。ex:enum week { Mo...原创 2019-09-05 11:00:55 · 4701 阅读 · 1 评论 -
C语言数据类型转换
一、 C在以下四种情况下会进行隐式转换:1.算术运算式中,低类型能够转换为高类型。2.赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。3.函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4.函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。二、 运算表达式中的自动类型转换运算表达式中,有如下类型转换规则:1. 字...原创 2019-09-04 14:07:09 · 634 阅读 · 0 评论 -
volatile、static和const关键字
一、volatile关键字volatile作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次从内存中重新读值。可以保证对特殊地址的稳定访问。应用场合:(1)并行设备的硬件寄存器(状态寄存器);(2)一个中断服务子程序中会访问到的非自动变量;(3)多进程应用中被几个任务共享的变量;1.当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键...原创 2019-09-04 14:10:06 · 472 阅读 · 1 评论 -
C--预处理命令
对一个程序而言,其中有些地方可以进行条件编译条件编译的语法形式如:预处理器条件:if 行文本 elif 部分 opt 部分 else 部分 opt #endifif 行:# 常量表达式#ifdef 标识符#ifndef 标识符elif 部分:elif 行 文本 elif 部分 optelif 行:#elif 常量表达式else 部分:else 行 文本else 行:#...原创 2019-09-16 10:02:10 · 209 阅读 · 0 评论 -
关于C语言中的位域问题
C中的位域在数据存储时,有的时候我们不需要一个完整的字节来存储数据,只需要其中的一个或几个二进制位就可以完整的表达,特别是在嵌入式设备中,对内存中的管理尤其严格,因为在嵌入式设备中,内存是有限的,因此,需要程序员对内存进行严格管理,C语言中为了节省存储空间,提供了一种数据结构,即“位域” 或”位段“。位域的定义与结构体的定义一样如:struct bit_fields{ int a:...原创 2019-09-24 11:24:41 · 665 阅读 · 0 评论 -
typedef---对函数声明的理解
在C程序中,我们都喜欢用typedef声明来简化函数的写法,使得程序具有更高的可读性。如在C语言中的signal库函数中,有一个signal函数,其函数的原型为:void (*signal(int SIG, void(*FUNC)(int))) (int);如果对其直接声明,则是:void (*signal(int,void (*)(int)))(int);这样看起来就很...原创 2019-09-25 14:04:07 · 585 阅读 · 0 评论 -
关于移位和乘除运算
有时候我们会看到程序中会用 “>>” 来代替 “/” 的运算,他们之间的关系是什么呢?如:int a = 4;int b = 4;a = a/2;b = b>>1;我们知道,最后a和b的结果相同,都是2通常,在程序中,如果需要乘(或除)2n,我们都可以使用移位的方式来代替,在大部分的C编译器和单片机编程中,用移位的方法的代码比使用乘除运算得到的代码的效率高...原创 2019-09-26 10:46:32 · 1042 阅读 · 0 评论 -
handle-exceptions: Error while dumping state (probably corrupted stack) segmentation fault
程序编译之后,运行程序出现以下错误:造成这种问题的原因有很多。如:1.int a = 5;int b = 0;a = a / b;如果程序代码这样,就会造成上面的错误,因为除数为零,违反了 '/' 运算符的右操作数(即:除数)不能为0的规则。2.访问不存在的内存地址在C语言中,segment fault通常是由于指针的错误使用,特别是动态分配,非关联化一个空指针总...原创 2019-09-29 09:26:48 · 491 阅读 · 0 评论 -
指针操作--4个8位数重组为1个32位数据
#include<stdio.h>typedef unsigned char int8;typedef unsigned int int32;int8 input[5] = {1,1,1,1,0};int32 hst(int8 *ndsk){ int32 m = 0; int8 *h = (int8 *)&m; h[0] = ndsk[0...原创 2019-10-08 15:29:25 · 3175 阅读 · 0 评论 -
C声明
声明(declaration)用于说明每个标识符的含义,并不需要为每个标识符预留存储空间,预留存储空间的声明为定义(definition)。其形式为:声明声明说明符 初始化声明符表 opt;其中,声明说明符由存储类说明符、类型说明符和类型限定符。...原创 2019-09-09 14:12:41 · 244 阅读 · 0 评论