![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
萧-十一
这个作者很懒,什么都没留下…
展开
-
C语言小程序判断机器大小端存储
大端法:数据在内存中按照从高有效位到低有效位的顺序存储 小端法:数据在内存中按照从低有效位到高有效位的顺序存储 这里以整数数据类型int为例,展示数据在内存中的存储顺序并判断大小端存储。我们将int类型变量val的地址经过强制类型转换后赋给char类型指针p,这样便可以按照地址顺序逐字节输出存储在内存中的变量val。 将val赋值为1,如果一小端法存储则val的第一个字节为’10000000’原创 2017-10-18 12:26:07 · 363 阅读 · 0 评论 -
【C++】trivial和non-trivial构造函数及POD类型
今天看书看到侯捷的《STL源码剖析》里提到trivial和non-trivial及POD类型,查了些资料理解了一下。trivial意思是无意义,这个trivial和non-trivial是对类的四种函数来说的: 构造函数(ctor) 复制构造函数(copy) 赋值函数(assignment) 析构函数(dtor) 如果至少满足下面3条里的一条: 显式(explict)定...转载 2018-07-06 16:37:12 · 1301 阅读 · 0 评论 -
【C++】如何使用基类指针遍历派生类对象数组
今天在一个群里看到一位老哥提出了这样一个问题。1. 基类指针自增起初我认为这是不可能实现的,确实,通过自增基类指针的方式是不能遍历派生类数组的。因为在编译时编译器不知道基类指针所指的对象是基类对象还是派生类对象,所以基类指针自增的移动距离只能是基类对象的长度,但是基类对象和派生类对象的长度往往是不同的,那么如果使用基类指针自增的方式遍历派生类数组就会产生未定义的行为。2.使用虚函数...原创 2018-07-04 17:06:13 · 4233 阅读 · 0 评论 -
C++中const限定符小结
const限定符const限定符用于定义一个常量const对象在定义时必须被初始化默认情况下,const对象仅在文件内有效。如果在不同的文件下出现了同名的const变量,则视作在文件中单独定义的独立变量。如果想在不同的文件中使用同一个从上图变量,则需要在声明和定义前都添加extern关键字。 //file1.cpp中定义一个const变量 extern const int A = 3...原创 2018-06-06 14:26:58 · 247 阅读 · 0 评论 -
swap的三种实现及区别
我们在实现一个swap函数或者宏定义时,往往会使用以下几种方式:使用辅助变量使用加减法使用位运算我以前使用swap时,从来没有对这三种方法做过区分,认为它们的效果完全一致,即使有区别也只在于使用加减法可能会造成溢出。然而除此之外,它们还是有区别的:那就是当要被交换的两个对象为同一个变量时,后两种方法会产生错误。#define swap1(a,b) {int t = a; a =...原创 2018-05-02 23:50:25 · 2195 阅读 · 0 评论 -
C语言do...while(0)使用小结
引言在一些C语言程序中我们会看到do...while(0);这样的语句,这样的用法貌似画蛇添足,实际却颇有妙用。单独来看,do…while(0)和顺序执行`...部分的代码的效果并无二致,然而在如下两种情况下的效果却十分巧妙。一.宏定义中实现局部作用域我们知道宏定义只是做一个标识符和字符串的替换,尽管宏定义的形式可以类似于函数,但是它实际并不具备与函数类似的局部作用域。当然了,我们可以...原创 2018-05-02 16:17:08 · 11930 阅读 · 2 评论 -
C语言的逻辑右移和算术右移
首先说明一下这两个概念: 逻辑右移:右移后左边添加0 算术右移:右移后添加的位与原数的符号位相同在C语言中,对于移位操作执行的是逻辑左移和算术右移,不过对于无符号类型,所有的移位操作都是逻辑的。 所以要相对一个有符号数执行逻辑右移,那么可以先将它强制类型转换为无符号类型。 如下int mian(){ int n = 0xfffffffe; int m = (u...原创 2018-03-11 15:08:31 · 23587 阅读 · 2 评论 -
C语言static关键字小结
在C语言中,static关键字用于普通变量和函数,它用于定义一个静态的变量或函数。下面对于它们各自的特点进行一下小结:静态全局变量在函数外部定义的变量前加上关键字static,这样定义的变量就是一个静态全局变量,有如下特点:存储于程序的全局数据区,作用范围为整个文件,与全局变量不同的是:静态全局变量只作用于本文件,对于其他文件是不可见的。例如,在一个文件中用如下语句定义一个全...原创 2018-02-08 15:19:46 · 269 阅读 · 0 评论 -
C/C++中指针的引用小结
我们知道C语言中,对于函数参数的传指针操作本质上仍然是一个传值过程,只是将实参指针的值传递给了函数中的一个临时变量,实质上我们传入函数的只是一块内存的地址,而非指针本身。所以如果在函数中改变形参指针所指向的地址,实参指针的指向是不会被改变的。 如下图代码所示void func(int *p){ int *n = new int; *n = 3; p = n;}原创 2018-01-30 12:56:16 · 164 阅读 · 0 评论 -
记一个关于标准IO流缓冲区的有趣例子
有如下一段代码#include <stdio.h>#include <unistd.h>int main() { printf("#\n"); write(1, "123", 3);}它的输出如下#123这段程序调用了printf和write两个函数,分别对应于带缓冲的流式IO和没有缓冲的直接IO。两个函数先后向屏幕输出“#\n”和“123”这两个字符串,这样的结果在我们的意料原创 2017-12-03 16:38:35 · 339 阅读 · 0 评论 -
C语言可变参数和格式化输出
可变参数我们知道在C++中可以通过函数重载的方式为函数提供接受可变个参数的功能,而在C语言中并没有重载的机制,不过C语言仍然提供了在头文件< stdarg.h >中提供了类似的功能。 在头文件中提供了va_list类型来存放可变参数列表(这个类型应该是一个指针),以及三个宏来实现相关的操作,三个宏的原型如下:void va_start(va_list ap, last_arg)//这个宏初始化原创 2017-12-09 15:48:00 · 2218 阅读 · 0 评论 -
浅析C语言中的数据对齐
许多计算机系统会对基本的数据类型的合法地址做出限制,要求数据的地址必须是一个值K的倍数,K值为基本数据的字节数。这就是数据对齐,其目的是为了简化处理器与内存之间的接口设计。假如一个处理器每次从内存取出8个字节,那么它每次所取的地址就是8的倍数,如果我们让所有的double类型数据的地址为8的倍数,那么只需一次内存操作就可以进行读写了,否则我们可能需要两次内存访问,因为数据可能分放在两个8字节的内存块原创 2017-11-07 11:03:57 · 1377 阅读 · 0 评论 -
C语言typedef使用小结
typedef int Mint; //Mint等价于inttypedef int Arr[5]; //Arr为有5个元素的int数组类型typedef int* Pi; //pi为指向int数据的指针类型typedef int Func(char); //func为一个函数类型typedef int (*Func)(char); //func为一个函数指针原创 2017-10-21 20:06:13 · 203 阅读 · 0 评论 -
记一个关于C语言函数指针使用的小例子
首先回顾函数指针的声明方式:(以一个返回值为空的有一个int类型参数的函数指针为例)void func(int); //函数void (*func)(int) //函数指针void (*func[5])(int) //函数指针的数组下面两份代码给出一个返回值为函数指针的函数的例子,演示声明该类函数的两种不同方式,以及函数指针的使用。#include <stdio.h>void (*func1(原创 2017-10-21 19:56:39 · 792 阅读 · 0 评论 -
C语言几种指针的声明方式
int a[5][5]; //int类型二维数组int ** a; //指向指针的指针,可用于二维数组int * a[5]; //指针数组int (*a) [5]; //指向一个具有5个元素的数组的指针int * a[5][5]; //存放指针的二维数组int (* a[3])[4]; //一个3元素数组,每个元素为指向具有4个元素的数组的指针原创 2017-10-21 20:15:58 · 1485 阅读 · 1 评论 -
C语言宏定义实现sizeof功能
可以使用如下两个宏定义实现类似sizeof的功能//针对T为一个类型名的情况#define _sizeof_type(T) (size_t)((T*)0 + 1)//针对T为一个变量或者数组名的情况#define _sizeof(T) ((size_t)(&T + 1) - (size_t)(&T))测试代码#include <stdio.h>...原创 2018-07-22 13:26:35 · 3394 阅读 · 1 评论