c关键字分析
来源:互联网 发布:linux和windows传文件 编辑:程序博客网 时间:2024/06/05 20:29
总结下c语言的基础知识
auto:
auto即C语言中局部变量的默认属性
编译器默认所有的局部变量都是auto的
static:
static修饰的局部变量存储在程序静态区
static的另一个意义是文件作用域标示符
register:
register变量的必须是CPU寄存器可以接受的值
不能用&运算符获取register变量的地址
goto:
禁用goto
程序质量与goto的出现次数成反比
将goto打入冷宫
void:
修饰函数返回值和参数
1.如果函数没有返回值,那么应该将其声明为void型
2.如果函数没有参数,应该声明其参数为void
不存在void变量
C语言没有定义void究竟是多大内存的别名
void指针
1.C语言规定只有相同类型的指针才可以相互赋值
2.void*指针作为左值用于“接收”任意类型的指针
3.void*指针作为右值赋值给其它指针时需要强制类型转换
extern:
1.extern用于声明外部定义的变量和函数
2.extern用于“告诉”编译器用C方式编译
sizeof:
1.sizeof是编译器的内置指示符,不是函数
2.sizeof用于“计算”相应实体所占的内存大小
3.sizeof的值在编译期就已经确定
const:
1.C语言中const修饰的变量是只读的,其本质还是变量
2.const只对编译器有用,在运行时无用
3.const修饰的数组是只读的,const修饰的数组空间不可被改变
4.const int* p; //p可变,p指向的内容不可变
5. int const* p; //p可变,p指向的内容不可变
6.int* const p; //p不可变,p指向的内容可变
7. const int* const p; //p和p指向的内容都不可变
总结:
*号左边时指针指向的数据为常量
当const出现在**后右边时指针本身为常量
const修饰函数参数和返回值
1.const修饰函数参数表示在函数体内不希望改变参数的值
2.const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
volatile:
1.volatile可理解为“编译器警告指示字”
2.volatile用于告诉编译器必须每次去内存中取变量值
3.volatile主要修饰可能被多个线程访问的变量
4.volatile也可以修饰可能被未知因数更改的变量
struct:
1.struct中的每个域在内存中都独立分配空间
2.可用于柔性数组
#include <stdio.h>#include <malloc.h>typedef struct _soft_array{ int len; int array[];}SoftArray;int main(){ int i = 0; SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10); sa->len = 10; for(i=0; i<sa->len; i++) { sa->array[i] = i + 1; } for(i=0; i<sa->len; i++) { printf("%d\n", sa->array[i]); } free(sa); return 0;}
union:
1.只分配最大域的空间,所有域共享这个空间
2.union的使用受系统大小端的影响
enum:
1.只能取定义时的离散值,枚举常量是真正意义上的常量
#include <stdio.h>enum Color{GREEN,RED=2,BLUE};int main(){enum Color c=BLUE;printf("%d\n",c);}
打印的值为3
#define:
1.#define宏常量只是简单的进行值替换
2.#define宏常量无类型信息
3.#define宏常量无法被调试
typedef:
1.typedef用于给一个已经存在的数据类型重命名
2.typedef并没有产生新的类型
3.typedef重定义的类型不能进行unsigned和signed扩展#error:
#error message
注:message不需要用双引号包围
#error编译指示字用于自定义程序员特有的编译错误消息类似的,#warning用于生成编译警告,但不会停止编译
#line:
#line用于强制指定新的行号和编译文件名,并对源程序的代码重新编号
#line number filename
注:filename可省略
#line编译指示字的本质是重定义__LINE__和__FILE__
#pragma:
1. #pragma是编译器指示字,用于指示编译器完成一些特定的动作
2.#pragma所定义的很多指示字是编译器和操作系统特有的
3.#pragma在不同的编译器间是不可移植的
#pragma message
1.message参数在大多数的编译器中都有相似的实现
2.message参数在编译时输出消息到编译输出窗口中
3.message可用于代码的版本控制
#pragma pack
什么是内存对齐?
不同类型的数据在内存中按照一定的规则排列;而不是顺序的一个接一个的排放,这就是对齐。
为什么需要内存对齐?
CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16字节
当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣
某些硬件平台只能从规定的地址处取某些特定类型的数据,否则抛出硬件异常
#:
1.#运算符用于在预编译期将宏参数转换为字符串
##:
2.运算符用于在预编译期粘连两个符号
- c关键字分析
- C语言关键字 restrict 分析
- C语言关键字分析系列
- 《C关键字分析》之const
- 【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)
- 情景分析“C语言的const关键字”
- 情景分析“C语言的const关键字”
- C语言的volatile关键字分析
- 《C关键字分析》之extern用法
- 《C关键字分析》之typedef与callback
- 情景分析“C语言的const关键字”
- 情景分析“C语言的const关键字”
- 《C关键字分析》之typedef与callback
- 《C关键字分析》之extern用法
- 情景分析“C语言的const关键字”
- 关键字分析
- C与C++的static关键字的分析
- [转载]情景分析“C语言的const关键字”
- JAVA 基础 (循环)
- VS2015 企业版不支持 JavaScript 语法高亮、智能提醒
- 聚合与组合
- JCIFS简介and利用JCIFS网络文件共享实现上传下载
- 开启CloudTrail全局设置
- c关键字分析
- C++标准程序库笔记(2)
- cs193P assignmentV 问题1
- HDOJ 1503 Advanced Fruits (最长公共子序列 LCS)
- Socket API 编程模型
- 《SELinux by example Using security enhanced Linux》读书笔记
- Block类型的使用
- MFC对话框程序不能响应WM_CHAR消息的解决办法
- UVA - 1456 Cellular Network