C语言深度理解
lbd0125
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入理解数据类型、变量属性、内存四区和指针
数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。数据类型的作用:编译器预算对象(变量)分配的内存空间大小。既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。变量本质:(一段连续)内存空间的别名。内存四区栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等。堆区(heap):一原创 2017-02-08 14:42:02 · 443 阅读 · 0 评论 -
2.6、++和--操作符
1、int i = 3; (++i) + (++i) + (++i) = ? //C语言中的灰色地带 第一种编译器结果18 6+6+6 第二种编译器结果16 5+5+(++i) gcc g++ 2、逗号表达式 int x = 3; int k = (++x, x++, x+10); 从左到右的顺序求原创 2017-02-21 13:15:29 · 303 阅读 · 0 评论 -
2.7、优先级和类型转换分析
1、警示:易错的优先级 2、C语言隐式类型转换 ·算术运算式中,低类型转换为高类型 ·赋值表达式中,表达式的值转换为左边变量的类型 ·函数调用时,实参转换为形参的类型 ·函数返回值,return表达式转换为返回值类型原创 2017-02-21 20:00:22 · 299 阅读 · 0 评论 -
3.1、宏定义和使用分析
1、#define定义宏常量可以出现在代码的任何地方2、#define从本行开始,之后的代码都可以使用这个宏常量3、#define表达式给有函数调用的假象,却不是函数4、#define表达式可以比函数更强大5、#define表达式比函数更容易出错6、宏表达式与函数的对比 ·宏表达式在预编译期被处理,编译器不知道表达式的存在 ·宏表达式用“实参”完全替代形参,原创 2017-02-22 20:23:21 · 300 阅读 · 0 评论 -
3.2、条件编译的使用分析
1、条件编译的行为类似于C语言中的if...else 条件编译是预编译指示命令,用于控制是否编译某段代码2、条件预编译技术 #ifndef _CON_H_ (和头文件一样) #define _CON_H_ -------------------- #endif3、条件编译的意义 (1).条件编译使得我们原创 2017-03-08 22:46:58 · 326 阅读 · 0 评论 -
3.3、#error和#line
1、#error用于生成一个编译错误消息,并停止编译 用法: #error message 注: message不需要用引号包围2、#error编译指示字用于自定义程序员特有的编译错误消息 类似的,#warning用于生成编译警告,但不会停止编译3、#line用于强制指定新的行原创 2017-03-08 22:48:13 · 336 阅读 · 0 评论 -
3.4、#pragma预处理分析
1、#pragma是编译器指示字,用于指示编译器完成一些特定的动作 #pragma所定义的很多指示字是编译器和操作系统特有的 #pragma在不同的编译器间是不可移植的 ·预处理器将忽略它不认识的#pragma指令 ·两个不同的编译器可能以两种不同的方式解释同一条#pragma指令原创 2017-03-09 22:34:37 · 225 阅读 · 0 评论 -
3.5、#和##运算符使用分析
1、#运算符用于在预编译期将宏参数转换为字符串 #include #define CONVERS(x) #x int main() { printf ("%s\n", CONVERS(Hello World原创 2017-03-11 22:36:39 · 476 阅读 · 0 评论 -
4.1、指针的基础
1、指针的本质 ·指针在本质上也是一个变量 ·指针需要占用一定的内存地址 ·指针用于保存内存地址的值 不同类型的指针占用的内存空间大小相同(地址总线32位机,4个字节)2、*号的意义 ·在指针声明时,*号表示所声明的变量为指针 ·在指针使用时,*号原创 2017-03-12 14:26:10 · 290 阅读 · 0 评论 -
4.2、数组的基础
1、数组是相同类型的变量的有序集合2、数组在一片连续的内存空间中存储元素3、数组元素的个数可以显示或隐式指定 int a[5] = {1, 2}; int b[] = {1, 2}; a[2],a[3],a[4]的值都是0 b包含了两个元素4、数组地址与数组名原创 2017-03-13 17:10:32 · 254 阅读 · 0 评论 -
2.5、位运算分析
1、~ 按位取反 & 按位与 | 按位或 ^ 按位异或 2、结合律 a&b&c (a&b)&c a&(b&c) 交换律 a&b b&a 3、左移和右移注意点 ·左移运算符 ·规则:高位丢弃,低位补0 ·右移运算符>> 把运算符的二进制位右移 ·规则原创 2017-02-20 16:13:20 · 332 阅读 · 0 评论 -
2.4、逻辑运算符的使用分析
1、int i = 0; int j = 0; if ( ++i > 0 || ++j > 0 ) { printf ("%d\n", i); printf ("%d\n", j); } i = 1; j = 0;2、程序中的短路 短路规原创 2017-02-19 13:37:21 · 376 阅读 · 0 评论 -
2.3、单引号和双引号
1、低位的地址是给操作系统用的2、char *p1 = 1; //p1指向地址为1的内存 (给操作系统用) char *p2 = '1'; //p2指向地址为49的内存 (给操作系统用) char *p3 = "1"; //p2指向字符串首地址,字符1的地址 p1和p2指向了不该指的地方,形成野指针原创 2017-02-18 13:58:09 · 597 阅读 · 0 评论 -
2.1、注释符号
1、编译器会在编译过程删除注释,但不是简单的删除而是用空格代替 int/*.......*/i; 编译通过 in/*..........*/t i; 编译不可行2、编译器认为双引号括起来内容都是字符串,双斜杠也不例外3、"/*...........*"型注释不能被嵌套4、写注释不是和人聊QQ,一定要准确有用,避免晦涩和臃肿原创 2017-02-16 22:28:03 · 417 阅读 · 0 评论 -
1.1、数据类型和变量深度理解
1、数据类型可以理解为固定内存大小的别名2、数据类型是创建变量的模子3、变量的本质是一段实际连续存储空间的别名4、程序中通过变量来申请并命名存储空间5、通过变量的名字可以使用存储空间原创 2017-02-08 14:17:15 · 290 阅读 · 0 评论 -
1.2、关键字auto、static、register的精华
1、auto即C语言中局部变量的默认属性 编译器默认所有的局部变量都是auto的 (栈区)2、static修饰的全局变量作用域只是声明的文件中 static修饰的函数作用域只是声明的文件中 static修饰的局部变量存储在(程序静态区) static的另一个意义是文件作用域标示符 静态局部变量只会被初始化一次3、regis原创 2017-02-08 14:24:49 · 311 阅读 · 0 评论 -
1.3、if、switch、break、continue、bool、float精度和函数设计注意点
1、严格来说C语言中是没有bool类型的2、typedef enum _bool { FALSE, TRUE }BOOL;3、if判断条件只是0或者非04、预防手误 if ( 0 == i )5、float型变量不能直接进行0值比较,需要定义精度原创 2017-02-09 21:47:08 · 416 阅读 · 0 评论 -
1.4、goto、void、extern、sizeof剖析
1、goto破坏了c语言顺序执行的规则2、void修饰函数返回值和参数仅为了表示无3、没有void的标尺,无法在内存中裁剪出void对应的变量(灰色替代)4、编译器厂商规定的void为1个字节(不可信)5、C语言规定只有相同类型的指针才可以相互赋值6、void*指针作为左值用于"接收"任意类型的指针7、void*指针作为右值赋原创 2017-02-09 22:51:48 · 392 阅读 · 0 评论 -
1.5、const和volatile深度理解
1、在C语言中const修饰的变量是只读的,其本质还是变量2、const修饰的变量会在内存占用空间3、本质上const只对编译器有用,在运行时无用4、不能直接改变const变量的值,要用指针改变5、const int cc = 1; int *p = (int *)&cc; p = 3;6、在语言中const修饰的数组是只读的7、const修原创 2017-02-10 22:58:34 · 258 阅读 · 0 评论 -
1.6、struct和union
1、在程序中可以定义一个空结构体2、空结构体的大小和编译器有关3、柔性数组即数组大小待定的数组4、C语言中结构体的最后一个元素可以是大小未知的数组5、C语言可以由结构体产生柔性数组 struct soft{ int len; int array[]; }6、 gcc编译时size原创 2017-02-13 22:01:28 · 189 阅读 · 0 评论 -
1.7、enum、#define和typedef的注意点
1、enum默认常量在前一个值的基础上加12、enum类型的变量只能取定义时的离散值3、enum color { GREEN, RED, BULE }; GREEN == 0, RED == 1, BULE == 24、enum定义的常量才是真正意义的常量5、枚举类型和#d原创 2017-02-15 16:19:36 · 366 阅读 · 0 评论 -
2.2、接续符和转义符
1、C语言中的接续符(\)是指示编译器行为的利器2、接续符的使用: (1).编译器会将反斜杠剔除,跟在反斜杠后面的字符自动解到前一行 (2).在连接单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格 (3).接续符适合在定义宏代码块时使用#define SWAP(a,b) \{原创 2017-02-17 22:06:39 · 488 阅读 · 0 评论 -
4.4、数组与指针
1、数组是一段连续的内存空间2、数组的空间大小为sizeof(array_type) * array_size3、数组名可以看做指向数组第一个元素的常量指针4、指针的运算 ·指针是一种特殊的变量,与整数的运算规则为 p + n;(unsigned int)p + n*sizeof(*p); ·结论: 当指针p指向一个桶原创 2017-07-08 20:43:17 · 277 阅读 · 0 评论
分享