摘要: 典型问题1: 下面的程序输出什么?为什么? snprintf将src的信息打印到buf中。 示例如下: 运行结果如下: 输出不符合我们的预期,我们预期输出hello %s。 分析如下: snprintf需要几个变参是由format决定的。 典型问题2: 示例程序如下: 第6行的字符串在编译器处理后会 阅读全文
posted @ 2018-08-26 23:32 周伯通789 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 任意的软件开发过程都会涉及到字符串,字符串的概念: ca是字符数组,其他几个都是字符串,因为最后都有'\0'。 示例程序如下: 运行结果如下: 第7、8行的程序,编译器会自动在字符串后面加上'\0'。 所有与字符串相关的操作与函数都依赖于最后的'\0',如果一个字符串没有'\0',那将退化为字符串组 阅读全文
posted @ 2018-08-26 22:35 周伯通789 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 数组名可以当做常量指针使用,那么指针是否也可以当做数组名来使用呢? 下标VS指针形式: 示例程序: 第11行将指针当做数组名来使用。 运行结果如下: 可以看到输出结果是正确的。 但是数组和指针是不同的。 示例程序: ext.c文件 当上述程序第5行为extern int a[];时,编译运行结果如下 阅读全文
posted @ 2018-08-26 20:49 周伯通789 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 数组的本质: 示例程序: 指针的运算: 指针的比较: 示例程序: 根据以上的分析,14、16、17、18行都是不合法的。15行可以编译通过,但是没有意义,因为两个指针不是指向同一个数组中的元素的。 示例程序: 运行结果如下: 小结: 阅读全文
posted @ 2018-08-26 20:27 周伯通789 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 数组的概念: 数组当中的元素没有名字,我们只能通过数组名和下标来访问数组中的元素。数组名a代表的是这5个存储空间的集合。代表的是这一段内存。 数组的大小: 示例程序: 运行结果如下: 当我们指定数组中的一部分元素之后,其他的元素就会被初始化为0,我们可以利用这个特性来讲数组全部初始化为0。做法为in 阅读全文
posted @ 2018-08-26 17:51 周伯通789 阅读(365) 评论(0) 推荐(0) 编辑
摘要: 程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间? 下面的程序输出什么? 运行结果如下: i的值发生了改变,但是在程序中,我们没有直接修改i的值,这就是因为指针的操作,通过指针我们改变了i的值。 *号的意义: 小贴士: 指针的使用示例: 运行结果如下: 传值调用与传 阅读全文
posted @ 2018-08-26 17:23 周伯通789 阅读(186) 评论(0) 推荐(0) 编辑
摘要: #运算符: 示例程序: 运行结果如下: 执行gcc -E test.c -o test.i单步编译,得到中间文件如下: 工程开发中#的使用示例: 运行结果如下: 单步编译的结果如下: ##运算符: 示例如下: 运行结果如下: 单步编译结果如下: 工程中的应用,在工程中我们可能需要定义成百上千个相同的 阅读全文
posted @ 2018-08-26 15:58 周伯通789 阅读(224) 评论(0) 推荐(0) 编辑
摘要: #pragma是C语言留给编译器厂商进行扩展用的。 这个关键字在不同的编译器之间也许是不能够移植的。 #pragma简介 #pragma message #pragma message打印的消息并不代表代码有什么问题。 示例: 编译命令如下: 可见,在编译期间,预处理器处理#pragma messa 阅读全文
posted @ 2018-08-26 14:10 周伯通789 阅读(562) 评论(0) 推荐(0) 编辑
摘要: #error的用法: 示例程序: 先注释掉3-5行的代码,使用gcc编译结果如下: 当出现这样的编译错误后不一定是我们的代码错了,可能是我们的编译器用错了。比如我们使用了开源代码或者第三方库经常会出现这样的错误。这样的错误我们不好定位,甚至看不懂这样的错误信息,这时我们只需要加上第3-5行的代码,然 阅读全文
posted @ 2018-08-26 13:07 周伯通789 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 条件编译的基本概念: 条件编译就是利用预处理器的功能来对代码进行一些删除操作。 程序示例: 运行结果如下: 单步编译的结果如下: 条件编译的本质: 通过命令行定义宏: 程序与运行结果如下: 如果我们判断一个宏标识符是否存在,需要使用#ifdef指令。示例如下: 执行单步编译: 中间结果如下: #in 阅读全文
posted @ 2018-08-26 12:09 周伯通789 阅读(150) 评论(0) 推荐(0) 编辑
摘要: C语言中的宏定义: 定义宏常量: 就宏定义来说,这是正确的,预处理器可以编译过。 但是就真正的编译来说,这是错误的,真正的编译会有语法错误。 示例程序: 执行预处理,gcc -E test.c -o test.i,预处理器处理之后结果如下: 预处理器进行直接的文本替换,是不会进行语法检查的。第4行最 阅读全文
posted @ 2018-08-26 11:09 周伯通789 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 工程中的每个C语言源文件被编译后产生目标文件,这些目标文件如何生成最终的可执行程序呢? 链接器: 静态链接: 静态链接就是将库文件或者目标文件直接加入到可执行文件当中。 Linux下静态库的创建和使用: 静态库示例程序:20-1.c slib.c 将slib.c制作成静态库: 先将slib.c编译成 阅读全文
posted @ 2018-08-26 10:30 周伯通789 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 初识编译器: 预编译: 示例程序: 源文件: 头文件: 执行预编译命令: 得到的中间文件如下: 预处理过后,注释被删掉了,7和9行的全局变量也直接被复制过来了,1-6行为需要传递给后续编译器的信息。我们在c文件中定义的宏也被展开了。 预编译其处理之后就该执行真正的编译了。 编译: 编译过程主要对源程 阅读全文
posted @ 2018-08-26 09:59 周伯通789 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 三目运算符: 在C语言中,三目运算符不能当左值使用。因为三目运算符最终返回的是一个值并不是一个变量。三目运算符作为左值时,相当于2 = 3,这种赋值,编译器当然会报错。 既然三目元算符返回的是一个值,那么有没有办法将它当做左值又不报错呢? 解决方案就是返回变量的地址。 第13行返回变量的地址。 运算 阅读全文
posted @ 2018-08-26 08:44 周伯通789 阅读(534) 评论(0) 推荐(0) 编辑