重要关键字
涉及流程和单数据类型的关键字,功能一般都比较简单,在使用过程中很快就会熟悉。下列关键字相对前者来说,功能较多,值得好好学习。
extern 实现外部链接
修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
1.extern放在变量之前 可以在函数外声明变量,作用域为文件作用域;在函数内声明也可以,作用域为函数作用域。只是声明;在extern使用初始化声明变量时,也将其视为变量的定义,不过编译器会报warning,运行ok。
2.extern放在函数前面 表明函数为外部函数,作用于文件间。C语言规定函数前的extern可以忽略。
3.extern “C” 声明C风格代码
c关键字详解
https://www.cnblogs.com/chaoyueziwo/p/4118906.html
extern “C”
https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
static 实现内部链接
static可以修饰函数,全局变量和局部变量。
1修饰函数 改变函数的作用域为 文件作用域,只在该源文件内可用;函数默认文件间共享,作用域为整个源程序。
2修饰全局变量 修改全局变量的作用域为 文件作用域;全局变量作用域默认为整个源程序,在所有的源文件中都有效。
3修改局部变量 存储方式从自动变量变为静态变量,改变其生存周期从局部 变为 整个 程序运行期。
静态变量只会初始化一次,反复调用某个函数中的静态局部变量,会不停修改其数值。
static有三个总要的作用
1.隐藏,对全局变量和函数而言,隐藏在文件内
2.保持变量内容的持久
3.默认初始化为0 和全局变量类似。 在静态数据区,内存中所有的字节默认值都是0x00
这两篇文章写得挺好的,看完可以自己总结下,转化为自己的知识。
https://blog.csdn.net/qq_37858386/article/details/79064900‘
http://c.biancheng.net/view/301.html
讲链接性的文章
https://zhuanlan.zhihu.com/p/260777861
1.链接:链接描述了名称在整个程序或一个翻译单元中如何引用或不引用同一实体。
2.只有在链接过程开始时,链接属性才起作用
作用域和链接属性
https://www.cnblogs.com/Black-Cobra/p/10072751.html
const 限定一个变量的值为只读
1.限定一个变量不允许被改变
2.const用在了函数形参中的时候,避免在函数中对变量做了修改
3.函数前用const修饰。返回的值不可被修改
4.有些全局变量是不希望在使用的过程中修改的,那么用const修饰可避免过程中被修改
const修改的变量需要初始化值。
其本质并不是常量。
const使用的基本形式: const type m修饰的对象是m;故const type *pm中 const修饰*pm
参考
https://blog.csdn.net/ziyuzhao123/article/details/18662207
问题1的例子不会编译报错,C99有可变长度数组。
次重要关键字
typedef 自定义类型别名
四种应用场景:
1.简单数据类型
2.自定义数据类型 struct union enum
3.数组和指针
4.函数指针
参考
http://c.biancheng.net/view/298.html
sizeof 获取字节长度 返回值为size_t
C语言的一种单目操作符。获取操作数的存储大小
1、用于数据类型
2、用于变量
sizeof有三种语法形式,如下:
- sizeof( object ); // sizeof( 对象 );
- sizeof( type_name ); // sizeof( 类型 );
- sizeof object; // sizeof 对象; 这个确实可以啊,有趣,仅对象(变量)可用。
当操作数是联合类型时,sizeof是其最大字节成员的字节数。
当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。(字节对齐)
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用。如char ary[ sizeof( int ) * 10 ];
sizeof操作符不能用于函数类型,不完全类型或位字段。
不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等
可以用于函数 GNUC gcc 7.5.0,不会报错诶,不过f的长度为1,有点意思
也是1。
C99和C11在printf提供%zd输出,sizeof()获取的值。有趣的知识点。
struct 定义结构体
结构体会字节对齐
union 定义联合体
音视频算法方面联合体是一个应用。
联合体可以不用考虑数据类型转换,但是要考虑大小端的情况。
不太懂哦~感觉挺多地方可以灵活运用这个东西。等遇到再写写吧。
enum 定义枚举类型
枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。枚举量是常量。
https://www.cnblogs.com/lanhaicode/p/10620028.html
register 寄存器变量
修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
声明为寄存器变量,但是实际执行看系统。
https://blog.csdn.net/21aspnet/article/details/257511
volatile
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
偏底层和硬件方面会用到这个关键字。
https://blog.csdn.net/lwbeyond/article/details/7265430
C语言数据类型
图片来自:https://blog.csdn.net/snake_lp/article/details/78631263
关键字汇总
这个链接罗列得非常清楚,大赞~ 借鉴一下
https://zhuanlan.zhihu.com/p/77474834
C语言关键字
auto:声明自动变量;
break:跳出当前循环;
case:开关语句分支;
char:声明字符型变量或函数返回值类型;
const:声明只读变量;
continue:结束当前循环,开始下一轮循环;
default:开关语句中的“默认分支”;
do:循环语句的循环体;
double:声明双精度浮点型变量或函数返回值类型;
else:条件语句否定分支(与if连用);
enum:声明枚举类型;
extern:声明变量或函数是在其它文件或本文件的其它位置定义;
float:声明浮点型变量或函数返回值类型;
for:一种循环语句;
goto:无条件跳转语句;
if:条件语句;
int:声明整型变量或函数;
long:声明长整型变量或函数返回值类型
register:声明寄存器变量;
return:子程序返回语句(可以带参数,也可不带参数)
short:声明短整型变量或函数;
signed:声明有符号类型变量或函数;
sizeof:计算数据类型或变量长度(即所占字节数)
static:声明静态变量;
struct:声明结构体类型;
switch:用于开关语句;
typedef:用以给数据类型取别名;
unsigned:声明无符号类型变量或函数;
union:声明共用体类型;
void:声明函数无返回值或无参数,声明无类型指针;
volatile:说明变量在程序执行中可被隐含地改变;
while:循环语句的循环条件;
asm:用于在C语言中嵌入汇编指令;
fortran:为Fortran语言链接而设定的条件性支持类型指令符。
1999年12月16日,ISO推出了C99标准,该标准新增了6个C语言关键字。
inline:用来定义一个类的内联函数,引入它的主要原因是用它代替C中表达式形式的宏定义;
restrict:只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。即所有修改该指针指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改,这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码;
_Bool:布尔类型的数据,其值为0或1,主要用来判断条件能否成立的真假;
_Complex:用来表示复数类型;
_Imaginary:用来表示虚数类型;
_Pragma:与#pragma指令相同的功能。
2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字。
_Alignas:指定某个变量按照其他数据类型对齐;
_Alignof:指定数据类型内存对齐的字节数;
_Atomic:原子类型说明符和限定符;
_Static_assert:声明在编译时有效,它将测试由用户指定且可以转换为布尔值的整数表达式表示的软件断言。如果表达式的计算结果为零(false),编译器将发出用户指定的消息,并且编译因错误而失败;
_Noreturn:表明调用完成后的函数不返回主调函数,目的是告诉用户和编译器,这个特殊的函数不会把控制返回主调程序,告诉用于以免滥用该函数,通知编译器可以优化一些代码。
_Thread_local:它会影响变量的存储周期,被修饰的变量具有线程周期,这些变量在线程开始的时候被生成,在线程结束的时候被销毁。并且每一个线程都拥有一个独立的变量实例。可以和static和extern关键字联合使用,这将影响变量的链接属性;
_Generic:可以简单地将一组具有不同类型却有相同功能的函数抽象为一个统一的接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)