当前位置:网站首页>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,否则存放随机值。
边栏推荐
- Entry node of ring in leetcode/linked list
- IMX6ULL—Assembly LED Lights
- ceph 创建池和制作块设备基操
- Volatile:JVM 我警告你,我的人你别乱动
- win10 uwp 改变鼠标
- 华为发布「国产Copilot内核」PanGu-Coder,而且真的能用中文哦!
- Jenkins deploys services to remote servers using pipelines
- 商业智能BI行业分析思维框架:铅酸蓄电池行业(一)
- An in-depth understanding of the implementation principle of Hybrid
- 神秘的程序员(20-30)
猜你喜欢
JMeter notes 6 | JMeter recording agent (configuration)
不是吧,连公司里的卷王写代码都复制粘贴,这合理?
What platform is EPIC?
What are some good open source automation testing frameworks to recommend?
进行知识管理的好处有哪些?
An in-depth understanding of the implementation principle of Hybrid
ASP.NET Core依赖注入之旅:针对服务注册的验证
Volatile:JVM 我警告你,我的人你别乱动
一口气拿下6个大厂offer,是什么水平
说了半天跨平台,今儿咱就来跨跨!(完结篇)——Kubenetes上手实践
随机推荐
【工业数字化大讲堂 第二十期】制造业数字化能力建设分享,特邀制造业高级咨询顾问 李东老师分享
动态RDLC报表(七)
MySQL索引的B+树到底有多高?
Discuz!论坛程序安装+模板配置教程
loadrunner script -- parameterization
.NET 6学习笔记(4)——解决VS2022中Nullable警告
URLError: <urlopen error [Errno 11004] getaddrinfo failed>调用seaborn-data无法使用
方舟:生存进化开服务器端口映射教程
Ark: Survival Evolved Open Server Port Mapping Tutorial
Discuz! Forum program installation + template configuration tutorial
Volatile: JVM I warn you, my people don't move
The difference between approach and method
LeetCode笔记:Biweekly Contest 84
Flink运行架构
为什么修补应用程序漏洞并不容易
动态RDLC报表(三)
Cortex-A7 MPCore Architecture
[Pycharm easy to use function]
华为发布「国产Copilot内核」PanGu-Coder,而且真的能用中文哦!
.NET现代应用的产品设计 - DDD实践