
C语言
文章平均质量分 85
hahahahhahello
这个作者很懒,什么都没留下…
展开
-
《C专家编程》:C:穿越时空的迷雾
1 C语言的史前阶段:C语言的出现证明了一件事儿,那就是失败时成功之母。因为一直被人们朝圣的C语言竟然源于一个失败的项目。1969,通用电气、麻省理工工学院和贝尔实验室联合创立了一个庞大的项目--Multics。该项目的目的是创建一个操作系统,但是最后失败了。当心灰意冷的贝尔实验室的专家们撤离Multics工程后,他们又去寻找其他的任务。其中一个叫Ken Thompson的研究人员对另一个操作...原创 2018-10-25 20:38:46 · 267 阅读 · 0 评论 -
警惕Interpositioning
Interpositioning就是通过编写与库函数同名的函数来取代该函数的行为。它可以使库函数在特定的程序中被同名的用户函数所取代,通常是用于调试或为了提高效率使用Interpositioning格外小心。很容易发生自己代码中某个符号的定义取代函数库中的相同符号的意外。不仅你自己所进行的所有对该函数的调用将被自己的版本的函数调用所取代,而且所有调用该库函数的系统调用也将用你的函数取而代之。...原创 2018-11-10 11:16:13 · 334 阅读 · 0 评论 -
《C专家编程》:对链接的思考
可执行程序产生的的流程绝大多数编译器并不是一个单一的庞大程序。它们通常由多达六七个稍小的程序所组成,这些程序由一个叫“编译器驱动器”的控制程序来调用。这些可以方便的从编译器中分离的单独程序包括:预处理器、语法和语义检查器、代码生成器、汇编程序、优化器、链接器。链接器:"a linker or link editor is a computer utility program ...原创 2018-11-10 10:51:10 · 316 阅读 · 0 评论 -
《C专家编程》:令人震惊的事实:数组和指针并不相同
数组和指针是如何访问的首先需要注意的是“地址y”和“地址y的内容”之间的区别。X = Y;在这个上下文环境里符号X的含义是X所代表的地址,这里被称为左值,左值在编译时可知,左值表示存储结果的地方符号Y的含义是Y所代表的地址的内容,这里被称为右值,右值直到运行时才知,如无特别说明,右值表示“Y的内容”C语言引入了“可修改的左值”这个术语。它表示左值允许出现在赋值语句的左边...原创 2018-10-27 21:21:35 · 220 阅读 · 0 评论 -
《C专家编程》:这不是Bug,而是语言特性
无论什么时候,如果遇到了这样一条语句malloc(strlen(str)),几乎可以断定它是错误的,而malloc(strlen(str + 1))才是正确的,这是因为其他的字符串处理库函数几乎都包含一个额外空间,用于容纳字符串结尾的'\0'字符,所以,人们很容易忽略strlen这个特殊情况。分析编程语言缺陷的一种方法就是把所有的缺陷归于3类:不该做的做了;该做的没做;该做但做得不合适多做...原创 2018-10-27 16:58:06 · 354 阅读 · 0 评论 -
《C专家编程》:分析C语言的声明
一些比较容易搞混的声明:char *p[20];char (*p)[20];第一种声明由于[]的优先级要高于*,所以p先与[]结合表示p是一个有20个元素的数组,这个数组的元素是指向char类型的指针第二种声明由于()的优先级要高于[],所以p先与*结合表示p是一个指针,指向一个有着20个char类型的元素的数组const int * gradeint const * gr...原创 2018-10-29 20:15:57 · 220 阅读 · 0 评论 -
C语言优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () ...原创 2018-10-29 19:27:24 · 4519 阅读 · 0 评论 -
typedef 与 #deifne的区别
在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏 定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++的宏定义命令,typedef 用来为一个已有的数据类型起一个别名,而#define是用来定义一个宏定义常量。下面谈谈两者在实际使用中应当注意的地方。1.typedef关键字 typedef...转载 2018-10-29 19:23:13 · 251 阅读 · 0 评论 -
C语言枚举enum与define的不同
两者只有很小的区别,在C语言中,枚举为整型,枚举常量为int型,因此它们都可以和其他整型类别混用而不会出错,而且枚举优点众多;能自动赋值;调试器在检验枚举变量时,可以显示符号值;服从数据块作用域规则。具体而言,两者的区别表现在以下几个方面:枚举常量是实体中的一种,而宏定义不是实体。 枚举常量属于常量,但宏定义不是常量。 枚举量具有类型,但宏没有类型,枚举变量具有与普通变量相同的性质,如作用...转载 2018-10-29 19:19:03 · 3346 阅读 · 0 评论 -
C语言之union共同体
C语言之union共同体原文章链接 :https://blog.youkuaiyun.com/qq_16628781/article/details/72529228知识点union共同体的定义; union空间长度的分配; 共同体个变量相互影响及原因; union的使用样例; 新名词记录{union共同体;Unicode;}概述在C语言中,给我们提供了分配和操作一块内存的方式,那就是...转载 2018-10-29 18:54:01 · 481 阅读 · 0 评论 -
typedef
1. 四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:...转载 2018-10-29 18:36:03 · 187 阅读 · 0 评论 -
C语言中的名字空间
C语言中的命名空间命名空间是为了解决 “在相同作用域内如何区分相同的标识符”。说明:只有在相同作用域的情况下才能使用到命名空间去区分标识符,在嵌套的作用域、不同的作用域区分标识符都用不到命名空间的概念。 在相同的作用域内,如果命名空间不同,标识符可以使用相同的名称。否则,即如果命名空间相同同,编译器会报错,提示重复定义。按照C99(章节6.2.3),命名空间可以分为四种: 所有...转载 2018-10-29 16:59:56 · 820 阅读 · 1 评论 -
解析char *p与char p[]
#include "stdio.h"char *get_string_1(){ char p[] = "hello world!"; return p;}char *get_string_2(){ char *p = "hello world!"; return p;}int main(){ char *p; p = get_str...转载 2018-10-29 16:07:56 · 591 阅读 · 0 评论 -
C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位...转载 2018-10-29 14:24:36 · 364 阅读 · 1 评论 -
《C专家编程》:运动的诗章:运行时数据结构
代码和数据的区别可以认为是编译时和运行时的分界线。编译器的绝大部分工作都跟翻译代码有关,必要的数据存储管理的绝大部分都在运行时进行从本质上来说,段是正在执行的程序中是一块内存区域,每个区域都有特定的目的下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干嘛的。bss段:bss段通常是指用来存放程序中未初始化的全局变量的一块区域。bss英文Block starte...原创 2018-11-12 09:49:40 · 226 阅读 · 0 评论