C/C++
kikajack
这个作者很懒,什么都没留下…
展开
-
C 语言的泛型实践
参考:C语言实现泛型编程很多语言内置了对泛型的支持(例如 C++,通过同名不同参数的函数支持泛型)。C 语言中需要借助空指针 void * 实现泛型。非泛型编程需要针对所有可能类型实现函数。void swapInt(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp;}void swapDouble(double *a, double *b) { double tmp = *a; *a = *b; *b = tmp;}泛型编程函原创 2020-10-14 13:13:26 · 360 阅读 · 0 评论 -
C 语言的面向对象实践
C 语言中没有类和对象的概念,但是可以通过 struct 结构体来实现同样的效果。类似 Golang 中的 struct,把 C 函数指针当做 struct 的成员,就可以为 struct 结构体对象添加方法:#include <stdio.h>typedef struct People { int age; void (*sing)(); int (*getAge)(struct People *p); void (*setAge)(struct Peop原创 2020-09-25 09:57:28 · 142 阅读 · 0 评论 -
C 语言中使用多字节字符,通过 UTF-8 支持中文
C 语言默认的 char 类型是单字节字符,仅支持 ASCII 码。但是 ISO C90 标准开始,定义了 wchar_t 类型用于支持多字节字符(头文件 wchar.h)。这一版标准中还定义了本地化和国际化相关的头文件 locale.h,可以通过其中的 setlocale 函数设置使用的字符集编码,一般用 UTF-8 足够了。每一种语言都分为内部编码(程序代码中使用的)和外部编码(例如打开的...原创 2019-09-01 15:26:49 · 10613 阅读 · 0 评论 -
gcc 和 gdb 常用选项
gcc编译步骤预处理,生成 .i 的文档[预处理器 cpp]:cpp test.c -o test.i编译,得到汇编代码 .s [编译器 cc1]:/usr/local/gcc-4.8.1/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1/cc1 test.i汇编,得到目标代码(机器指令).o [汇编器 as]:as test.s -o test.o...原创 2019-06-19 13:31:14 · 1114 阅读 · 0 评论 -
C 语言二级指针的段错误
C语言中的指针变量C 语言中,指针变量也是变量,只不过跟 char、int 型等基本类型变量不同,指针变量中保存的是其他变量的地址和类型。通过这个地址,并根据类型来读取指定长度的字节,就可以把这个变量解析出来。int a = 3;int *p = &a; // & 是取地址符号,返回变量 a 的地址printf("%d\n", *p);C 语言中本身不支持字符串,但是...原创 2019-06-02 11:27:24 · 802 阅读 · 0 评论 -
C语义的预处理 - 宏定义中 # 和 ## 的意义及用法
宏定义基本语法C 语言中,所有预定义的宏,都会在预处理阶段进行替换。宏定义的语法为:#define 宏名 字符串简单宏定义下面的示例中,预处理后,所有出现 MAX 的位置都会被替换为 100:#include <stdio.h>#define MAX 100int main() { printf("MAX is: %d\n", MAX); return 0;}...原创 2019-05-25 13:12:03 · 388 阅读 · 0 评论 -
【C语言工具】AddressSanitizer - 内存检测工具
Github 地址:https://github.com/google/sanitizersWiki 地址:https://github.com/google/sanitizers/wiki/AddressSanitizer参考:https://www.jianshu.com/p/3a2df9b7c353AddressSanitizer(地址杀菌剂,简称 ASan) 是谷歌出品的内存检查工具...原创 2019-05-04 13:56:16 · 1348 阅读 · 0 评论 -
C 语言的函数 - 内存分析
函数基本概念Linux 中,函数在内存的代码段(code 区),地址比较靠前。函数定义C 语言中,函数有三个要素:入参、返回值、函数名,缺一不可。函数使用前必须先声明,或者在使用之前定义。函数声明格式如下:int test(int a, char *p);函数定义格式如下:int test(int a, char *p){ // 干点啥 return 666;}函数调用...原创 2019-01-22 23:13:02 · 577 阅读 · 1 评论 -
程序的内存分布 - 以 Linux 为例,基于 C 语言分析
这里以 Linux 为例,用 C 语言进行演示。内存模型-内存空间名称内容读写操作分配时机高地址kernel 内核空间命令行参数、环境变量等不可读写程序运行时-stack 栈空间局部变量可读写程序运行时-heap 堆空间malloc() new() 内存分配函数创建可读写程序运行时-全局数据空间(初始化的和未初始化的)静态...原创 2019-01-21 23:38:53 · 374 阅读 · 0 评论 -
C 语言结构体 struct 及内存对齐
对于 32 位数据总线的机器,每次内存操作都固定传输 32 位数据,且都没有重叠时,效率是最高的。所以操作系统把内存按照数据总线的位数划分为独立单元,每个单元都完整的分配给一个程序。C 语言的 struct 结构体中,可以放各种类型、不同长度的数据,可以看做一个数据包。为了在程序内部提高内存访问效率,也需要对齐内存。内存对齐下面的示例,struct People 中的第一个变量 sex 会对...原创 2019-01-20 22:43:20 · 176 阅读 · 0 评论 -
C语言的指针和数组
指针和内存指针变量也是个变量,不过保存的是另一个变量的地址。另外编译器还会记住指针所指向变量的类型,从而在指针运算时根据变量类型采取不同操作。例如,char * a 定义了char 类型的指针变量 a,通过 *a 读取数据时,每次只会读一个字节(char 类型变量的长度)。而int * i 定义了 int 类型的指针变量 i,通过 *i 读取数据时,每次会读两个或四个字节(int 类型变量的长...原创 2019-01-20 22:15:05 · 288 阅读 · 0 评论 -
C 语言的运算符
算术运算C 语言支持 + - * / % 五种运算,加减乘除取模。所有 CPU 都内建加法器,可以完成加法操作。减法操作可以转为加法操作。大部分 CPU 都没有内置乘法器,此时编译器会把 * / 乘除运算转为加法运算,用软件来模拟乘法。逻辑运算逻辑运算的返回结果是 1 或 0,C 语言中没有布尔类型,真假即用 1 和 0 代替。|| 和 &&逻辑与 &&...原创 2019-01-19 22:04:03 · 257 阅读 · 0 评论 -
C 语言中的关键字 - 数据类型、数据修饰符及逻辑结构
C 语言中有 32 个关键字。这是留个编译器用的特殊字符串,用户不可以使用。特殊关键字sizeof 和 return 是 C 语言中的两个特殊关键字。sizeofsizeof 用于计算变量所占内存空间的字节数,返回值为 unsigned long 无符号长整型。sizeof 不依赖底层操作系统,可以在编译时直接得到。有两种用法:int a;printf("%lu\n", sizeof...原创 2019-01-19 20:17:55 · 854 阅读 · 0 评论 -
C 语言中的预处理
C 语言中以 # 开头的就是预处理指令,例如 #include 。预处理指令的用途所有的预处理指令都会在 GCC 编译过程的预处理步骤解析执行,替换为对应的内容。在下一步编译过程中,看不到任何预处理信息,只需要对独立的程序文件进行操作即可。预处理指令的类型包含类 #include 头文件通过 #include 引入的头文件,会在 GCC 编译过程中的预处理步骤进行展开,替换为完整的头文...原创 2019-01-19 15:30:18 · 216 阅读 · 0 评论 -
GCC 使用-C语言编译过程
任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言。编译器就相当于翻译官,将高级语言翻译为机器语言。GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler。后来扩展为可以编译多种语言,所以又称为 GNU Compiler Collection。GCC 是开源免费的编译器。GCC 常见用法GCC 是一组工具的集合,这些工具可以执行预处理、编译、汇编、链接等任...原创 2019-01-19 12:45:45 · 1082 阅读 · 0 评论 -
Java 与 C++ 的比较
参考Java 中,一切皆是类Java 中,所有数据或方法都要放在类中。如果想获得与全局函数等价的功能,可将static方法和static数据放在类里。而 C++ 中有 struct 结构、enum 枚举、union 联合等各种组织形式。Java 代码:public class T { public static void main(String[]args) { System.out...原创 2018-12-16 13:21:10 · 5525 阅读 · 0 评论 -
C 语言跟 C++ 的差异比较
C++ 完整的 CHM 版离线手册,可以 从这里下载。C++头文件不必是 .h 结尾C语言中的标准库头文件,例如 math.h 和 stdio.h,在C++中被命名为 cmath 和 cstdio:#include <cmath>#include <cstdio>int main() {double a = 1.2;a = sin(a);printf("%...原创 2018-11-18 19:48:30 · 415 阅读 · 0 评论