C语言
Roger-Pang
这个作者很懒,什么都没留下…
展开
-
C语言之char类型的符号
char 类型所占的存储空间一般为 1byte, 实际上char类型要么是 signed char 要么是 unsigned char, signed char 的范围是 -127~127, unsigned char 的范围是 0~256, char具体是signed还是unsigned取决于编译器. 这就带来了可移植性问题. 一个解决方案是使用char时显式的规定char为signed ...原创 2018-03-16 23:45:20 · 6128 阅读 · 0 评论 -
C语言之指向函数的指针
这里介绍了关于指向一维数组的指针, 相关内容可以参考该文. 本文将简要介绍指向函数的指针.如何声明一个指向函数的指针?void print(int num); // 声明函数void (*funptr)(int) = print; // 声明指向函数的指针, 该函数接受一个int参数, 返回void, 并用print函数的地址初始化函数指针类型的通用形式: 返回类型 (...原创 2018-04-20 19:17:19 · 10451 阅读 · 7 评论 -
C语言之复杂结构体的访问
任意一个可以在结构外部声明的变量都可以作为结构的成员. 包括数组, 指针, 其他结构等. 对于结构成员的访问可以使用 点操作符(.) 和 箭头操作符(->) 完成. 本文举例介绍复杂结构体成员的访问. 结构体声明如下:// 创建新的结构类型Tagtypedef struct{ int num; short date[3];} Tag;// 创建新的结构类型Ms...原创 2018-04-13 23:43:22 · 2148 阅读 · 3 评论 -
C语言之数组下标引用与间接引用
数组元素的访问方式有下标引用和间接访问两种. 除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript)) 例如:int arrayname[10];int *arrayptr = arrayname + 2;arrayptr = arrayname+2 = &arrayname[2]...原创 2018-04-13 21:47:24 · 3867 阅读 · 0 评论 -
C语言之安全的动态内存分配
动态内存分配最常见的错误就是忘记检查所请求的内存是否分配成功. 可以利用 宏 实现安全的动态内存分配.// alloc.h#include <stdlib.h>#define malloc 不要直接使用malloc // 直接使用malloc将无法编译#define MALLOC(num, type) (type *)alloc((num) * sizeof(type))...原创 2018-04-04 22:26:52 · 363 阅读 · 0 评论 -
C语言之指向一维数组的指针
int array[5] = {1, 2, 3, 4, 5}; // 定义数组int *intptr = array; // 定义指向数组元素的指针int (*arrayptr)[5] = &array; // 定义指向数组的指针上述三条语句分别定义了数组, 指向数组元素的指针和指向数组的指针. 内存情况如图示: 对于指向数组元素的指针很好理解, 但是怎样理解 指向数组的指针...原创 2018-04-17 11:41:53 · 58082 阅读 · 6 评论 -
C语言之联合与变体记录
结构体是将一个对象(内存空间)解释为C语言中多种类型的综合. 联合 是将一个对象(内存空间)在不同时候解释为C语言中不同的类型.// 联合union { float f; int i;} fi;当使用 fi.f 时, fi所占内存中的内容将被解释为一个float数; 当使用 fi.i 时, fi所占内存中的内容将被解释为一个int类型. 注意: 如果联合的各个成员具...原创 2018-04-14 15:32:43 · 1109 阅读 · 0 评论 -
C语言之位段
结构体可以用来实现 位段, 在C语言中多数情况下按照一个字节的整数倍为单位处理数据, 也就是必须是以 8位 为单位处理数据, 比如一个char为8位, 一个int可能为32位. 位段使我们可以按 “任意” 位处理数据, 比如7位, 6位等. 位段的声明如下:// 位段声明// [类型] [标识符] : [位宽表达式]struct CHAR { int32_t ch ...原创 2018-04-14 14:11:24 · 2530 阅读 · 0 评论 -
C语言之结构的自引用与互引用
自引用 在一个结构内部包含一个类型为该结构本身的成员称为结构的自引用. 比如:// 结构的自引用struct self_ref { int a; struct self_ref b; char c;};这种类型的结构自引用是 非法 的, 成员b中又会包含一个self_ref结构, 如此递归下去永无止尽. 下面这种声明却是合法的:// 另一种自引用...原创 2018-04-14 13:32:35 · 1481 阅读 · 0 评论 -
C语言之数组名
我们知道数组名实际上是一个指针. 问题的关键是数组名指向的内容是什么.对于一维数组来说, 数组名是指向数组第一个元素的内存空间的指针常量. 比如: int array[10]; 数组名array代表的就是array[0]的地址. array+1 代表的是array[1]的地址, 也就是说 array的步进间隔为一个int变量所占的内存空间.对于二维数组来说, 数组名是指向数组第一维元素的...原创 2018-04-14 11:47:21 · 844 阅读 · 1 评论 -
C语言之作用域 链接属性 存储时期 存储类型
重要的概念 标识符: C语言中变量名, 函数名, 函数参数名都称为标识符. 作用域: 标识符的作用域指的是此标志符在当前源代码中可见(可被访问)的范围 链接属性: 标识符的链接属性指的是如何处理不同文件中出现的相同标识符 存储时期: 变量的存储时期指的是变量内存在程序执行中存在的时期 存储类型: 变量的存储类指的是存储变量的内存的类型 存储类说明符: C语言的存储类说明符用来改变标识...原创 2018-03-22 14:16:12 · 483 阅读 · 2 评论 -
C语言之字符数组的初始化
C语言字符数组有几种不同的初始化方式, 它们之间存在着一些差别.char message1[] = {'h', 'e', 'l', 'l', 'o'}; 执行上述初始化后内存情况为: 注意到字符数组并不是以 ‘\0’ 结尾.char message2[] = {'h', 'e', 'l', 'l', 'o', '\0'}; 执行上述初始化后内存情况为: 手动加上了 ‘\0’...原创 2018-03-22 23:21:41 · 1846 阅读 · 1 评论 -
C语言之可变参数列表
对于函数参数的个数或者类型在编写函数时未确定的情况, C语言允许使用 可变参数列表, 用 , ... 来表示. 使用可变参数列表要注意:含有可变形参的形参列表中, 至少要有一个确定类型的形参在可变参数列表 (, ...) 的后面不能再跟其他形参由于可变参数列表中的形参类型不确定, 所以编译器将对传入的实参执行默认 实参提升, 比如传入实参为char型, 将自动提升为int型需要借助 s...原创 2018-03-22 21:15:01 · 1262 阅读 · 0 评论 -
C语言之指针表达式
本文主要以一个例子分析一些复杂的指针表达式. 首先定义变量如下:char ch = 'a';char &ptr_ch = &ch;char **pptr_ch = &ptr_ch;假设设备有64KB的内存, 地址标号为 0x0000~0xFFFF, 再假设执行上述代码后内存分配情况如下图: 表达式 作为右值 作为左值 ch...原创 2018-04-13 20:45:37 · 995 阅读 · 0 评论 -
C语言之存储类说明符
作用域 链接属性 存储时期 存储类型内容请先参考博文C语言有5中存储类型修饰符: auto register static extern typedef 下面分别介绍各说明符的用法:auto: 表明变量具有自动存储类型 auto说明符只能用在具有代码块作用域的变量的声明中, 但是由于这类变量本身就具有自动存储类型(存储于运行时堆栈中), 所以auto通常只是起显式说明的作用....原创 2018-03-22 14:18:36 · 1648 阅读 · 0 评论 -
C语言之短路求值
C语言的逻辑操作符 && , || 具有 短路求值 的特性.逻辑与 && && 操作符的左操作数总是首先进行求值, 如果它的值为真, 则继续计算右操作数的值, 然后执行与操作得到表达式结果; 如果它的值为假, 根据与操作 有假则假 的性质可以断定该表达式的值为假, 所以不再计算右操作数的值.逻辑或 || || 操作符的左操作数也是首先进行...原创 2018-03-17 19:30:31 · 3350 阅读 · 0 评论 -
C语言之逻辑移位与算术移位
C语言的移位操作符 >> << 可以将值按照二进制位左移或右移. 具体的实现方式如下:左移 << 左移时值最左边的几位被丢弃, 右边多出来的空位用 0 补齐. 右移 >> 右移时值最右边的几位被丢弃, 对于无符号数, 跟左移时一样空位补 0, 对于有符号数, 左边多出来的空位的有两种选择: 逻辑右移 会将空位补 0, 算术右...原创 2018-03-17 10:41:24 · 6173 阅读 · 3 评论 -
C语言之预处理器
预处理器在源代码编译前对其进行一些文本性质的操作, 主要任务包括删除注释, 插入被 #include 指令包含的文件的内容, 定义和替换由 #define 指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译.#define指令 #define 指令主要有两种用法: 定义常量: #define name stuff 当源代码中出现 name 符号时都会被原封不动的替...原创 2018-04-21 21:16:37 · 2604 阅读 · 1 评论