当前位置:网站首页>C的一些琐碎
C的一些琐碎
2022-08-09 17:24:00 【hellozhengyuan】
编译预处理
#if
#ifdef
#ifndef
#else
#elif
#endif
#define
#undef
#line 指令变__LINE__和__FILE__内容,都是编译程序预定义的标示符。主要用于调试和特殊应用。
#linenumber [“filename”]
#error 强制编译程序停止编译,主要用于调试程序。
格式: #errorerror_message(不需要双引号)
#pragma 编译程序实现时定义的指令,它允许由此向编译程序传入各种命令。
#pragmapack(2) //2字节对齐
#include
C语言允许宏带参数。
#和##
操作符#通常称为字符串化的操作,它其后的串变成双引号包围的字符串。
#definemkdir(s) #s
printf(“mkdir(Ilove c)”);
字符串连接符##,可以把两个独立的字符串连接成一个字符串。
#defineLINK(number) link_function##number
void link_function3(char *p)
{
printf("%s\n",p);
}
int main()
{
char*p ="helloworld";
LINK(3)(p);
return 0;
}
五个预定义宏:
#include<stdlib.h>
__DATE__
__FILE__
__LINE__
__TIME__
__func__
& ~ | ^ << >>
为了节省存储空间,C语言提供了位域/位段的数据结构。
所谓位域就是把一个字节中的二进制划分为结构不同的区域,并说明每个区域的位数。
struct 位域结构名{
位域列表;
};
struct bs{
inta:8;
intb:2;
intc:6;
}data;
data共占两个字节8+2+6,一个位域必须存储在同一个字节里,不能跨两个字节;位域长度不能大于一个字节的长度;位域可以没有位域名,只用来填充或调整位置,但是无名的位域是不能使用的。
对函数指针的解释:
调用函数实际上等同于“跳转指令+参数传递处理+回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器。
因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以“调用”一个根本不存在的函数实体。
比如:
386cpu启动后跳转至绝对地址0XFFFF0(对应C语言指针是0XF000FFF0,0XF000为段地址,0XFFF0为段内偏移)执行
typedef void (*lpFunction) ();
lpFunction lpReset =(lpFunction)0XF000FFF0; //CPU启动后所执行第一条指令的位置
lpRest(); //调用函数
数组与动态内存申请:
嵌入式系统内存有限,不经意的内存泄露都会很快导致系统的崩溃。
尽可能使用数组,数组不能越界;
如果使用动态内存申请,申请后要判断是否申请成功,并且malloc和free应成对出现。
const:
位置不一样,所表达的只读含义也不一样。
给读代码的人传递有用的信息,实际上告诉用户这个参数的应用目的。
给优化器一些附加信息,使用const关键字能产生更紧凑的代码。
使编译器保护那些不希望被修改的参数,防止被无意的代码修改,减少BUG的出现。
Static:
在函数体中一个被声明为静态的变量在这一个函数被调用过程中维持其值不变。
在模块内(但在函数体外)的静态变量可以被模块内的所有函数使用,但是不能被模块外其他函数访问,它是一个本地的全局变量。
在模块内的静态函数只可被这一模块内的其他函数调用,这个函数被限制在声明它的模块的本地范围内使用。
总的来说,static起到的限制限制变量的作用域和设置变量的存储域的作用。
字符串常亮常量
字符串常量出现在表达式中,它的值是指针常量。编译器把该字符串的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。
可以对字符串常量进行下表引用、间接访问及指针运算。
“xyz”+1, 指向第二个字符。
*”xyz”,注意此处因为字符串常量的类型是“指向字符的指针”,所以对字符串常量的间接访问就是它指向的字符。结果并不是整个字符串,而是第一个字符x。
“xyz”[2] z
字符串常量可以初始化指针和数组:
在初始化指针时,只有在定义的同时赋值给指针才对字符串常量进行初始化,只有对字符串常量才是如此:char* p = “wow”;此时创建的字符串常量被定义为只读。
在有些编译器中,字符串常量被存放在只允许读取的文本段中,防止它被修改。
Array_name和&array_name:
前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。
chararray[MAX];
char*p = array;
char*pa = &array; //error,&array的类型是char(*)[MAX]类型
char(*pb)[MAX] = &array; //OK
实数不允许进行%运算。
C语言规定只有静态存储static数组和外部extern数组才能初始化为0,否则存放随机值。
边栏推荐
- 偷偷盘点一下各大互联网公司的实习薪资
- Ark Standalone/Administrator Special Item Command Codes
- Cortex-A7 MPCore Architecture
- 搭建Zabbix监控系统
- Unity Webgl与JS相互交互 Unity 2021.2之后的版本
- JMeter notes 6 | JMeter recording agent (configuration)
- Jenkins deploys services to remote servers using pipelines
- 商业智能BI行业分析思维框架:铅酸蓄电池行业(一)
- 动态RDLC报表(四)
- An in-depth understanding of the implementation principle of Hybrid
猜你喜欢

The strongest distributed lock tool: Redisson

释放数据价值的真正法宝,数据要素市场化开发迫在眉睫

ASP.NET Core依赖注入之旅:针对服务注册的验证

论文解读:Deep-4MCW2V:基于序列的预测指标,以鉴定大肠杆菌中的N4-甲基环胞嘧啶位点

How tall is the B+ tree of the MySQL index?

JVM内存模型和结构详解(五大模型图解)

毕昇编译器优化:Lazy Code Motion

The senior told me that the MySQL of the big factory is connected through SSH

approach和method的区别

动态RDLC报表(七)
随机推荐
2022 全球 AI 模型周报
Volatile:JVM 我警告你,我的人你别乱动
Cortex-A7 MPCore Architecture
win10 uwp 装机必备应用 含源代码
50道Redis面试题,来看看你会多少?
Detailed explanation of JVM memory model and structure (five model diagrams)
JSDN博客系统
动态RDLC报表(二)
The most complete architect knowledge map in history
win10 uwp 无法附加到CoreCLR
ceph集群部署
秋招面试大厂总被刷下来,你这样做保准你事半功倍!
100+开箱即用的AI工具箱;程序员150岁长寿指南;『地理空间数据科学』课程资料;Graphic数据可视化图表库;前沿论文 | ShowMeAI资讯日报
The difference between approach and method
shared usage in d
手写flexible.js的原理实现,我终于明白移动端多端适配
win10 uwp 活动磁贴
华为发布「国产Copilot内核」PanGu-Coder,而且真的能用中文哦!
方舟单机/管理员特殊物品指令代码大全
CPU状态信息us,sy,ni,id,wa,hi,si,st含义