当前位置:网站首页>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,否则存放随机值。
边栏推荐
- 释放数据价值的真正法宝,数据要素市场化开发迫在眉睫
- JMeter notes 6 | JMeter recording agent (configuration)
- 最强分布式锁工具:Redisson
- 100+开箱即用的AI工具箱;程序员150岁长寿指南;『地理空间数据科学』课程资料;Graphic数据可视化图表库;前沿论文 | ShowMeAI资讯日报
- 一文深入了解 Hybrid 的实现原理
- Sublime Text如何安装Package Control
- How to choose a good SaaS knowledge base tool?
- 国能准能集团研发矿山数字孪生系统 填补国内采矿行业空白
- 动态RDLC报表(五)
- .NET 6 study notes (4) - Solve the Nullable warning in VS2022
猜你喜欢
手写flexible.js的原理实现,我终于明白移动端多端适配
方舟开服务器Vmware虚拟机安装不上?
Discuz! Forum program installation + template configuration tutorial
IMX6ULL—Assembly LED Lights
ASP.NET Core依赖注入之旅:针对服务注册的验证
动态RDLC报表(七)
最强分布式锁工具:Redisson
URLError: <urlopen error [Errno 11004] getaddrinfo failed>调用seaborn-data无法使用
ARM 汇编基础
.NET现代应用的产品设计 - DDD实践
随机推荐
win10 uwp 获取指定的文件 AQS
重定向操作
体验远超Hue,这才是技术人员最喜欢的SQL工具
One-key login principle of local number
Ark: Survival Evolved Open Server Port Mapping Tutorial
2022秋招面试宝典,啃完面试稳了
十七、一起学习Lua 错误处理
方舟:生存进化开服务器端口映射教程
JMeter notes 6 | JMeter recording agent (configuration)
win10 uwp 简单MasterDetail
艺术与科技的狂欢,云端XR支撑阿那亚2022砂之盒沉浸艺术季
50道Redis面试题,来看看你会多少?
ASP.NET Core依赖注入之旅:针对服务注册的验证
Engaged in software testing for a year, only basic functional testing, how to further study?
[极客大挑战 2019]HardSQL
有什么好的开源自动化测试框架可以推荐?
win10 uwp 改变鼠标
The most complete architect knowledge map in history
megacli磁盘阵列
Tan Zhongyi: Do you know who the "Queen of Open Source" is?