当前位置:网站首页>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,否则存放随机值。

原网站

版权声明
本文为[hellozhengyuan]所创,转载请带上原文链接,感谢
https://blog.csdn.net/baidu_20351223/article/details/115802245