对于switch语句,一般有很多种可能的跳转路径(CPU的预测分支会很抓狂),使用跳转表(虚函数、继承、动态规划等都会遇到),具体跳转时可能会用到决策树(if-elseif-elseif-else) 。
- x = y>2 等价于 x = (y>2) 不等式为高优先级
- 当一个数组作为函数的参数,那么这个数组名就是一个指针变量
- 指针:指针——>地址——>计算机底层(更高效) 对指针+1==对指针的值加上它指向对象的字节的大小。
- int (*p)[2] //p是指向一个包含两个元素的数组的指针 a pointer to an array int *p[3] ——定义了p[0],p[1],p[2]三个指针 array of pointers
- p[]与*p比为高优先级;++也比*的优先级高。
- putchar(*string++)输出string指向的值
- shilf+F11可以跳回刚刚按F11的位置
- while(*string) 当string指向空字符('\0')时,*string的值为0,退出循环(常用)
- 应用字符串比较函数strcmp(,):一个优点是它比较的是字符串(以'\0'结束,不是字符),而不是数组,可用来比较存放在不同大小数组里的字符串。
- x = rand() % dst.cols;//保证x和y都在src的行数和列数范围内
y = rand() % dst.rows; -
指针的作用:
我想在不同的代码里,都处理这块数据。
不用某种引用语义,你说怎么办?
-
命名是结尾不重要的字母省略eg:travLevel()
-
long long是标准的8 bytes,不受编译器限制,所以,16位的依然也是8 bytes。
-
size_t位于std命名空间内,size_t只是一个typedef,是C++计算个数(例如char* based字符串内的字符个数或STL容器内的元素个数),不带正负号unsigned类型。也是vector deque 和string内的operator[]函数接受的参数类型。
-
virtual意味着等待,直到运行期间才确定调用哪个函数!inline意味着执行前,先将调用动作替换为被调用函数的本体。
-
default构造函数:要不没有实参,要不就是每个参数都有缺省值(默认值)
-
构造函数被声明为explicit,可阻止别用来执行隐式类型转换。
-
计算机内存地址为什么要使用8位的16进制,为什么不是10进制?16进制和二进制转换很容易看出来,一位就是4个二进制位。
-
-
结构体对齐:
(windows)具体对齐的原则是,如果数据类型需要 K 个字节,那么地址都必须是 K 的倍数,比方说这里 int 数组 i 需要是 4 的倍数,而 v 则需要是 8 的倍数。
(linux)Linux中的对齐策略是“2字节数据类型的地址必须为2的倍数,较大的数据类型(int,double,float)的地址必须是4的倍数”
根据这种特点,在设计结构体的时候可以采用一些技巧。例如,要把大的数据类型放到前面,假如我们有两个结构体:struct S4 { char c; int i; char d; } *p; struct S5 { int i; char c; char d; } *p;
对应的排列是:
这样我们就通过不同的排列,节约了 4 个字节空间,如果这个结构体要被复制很多次,这也是很可观的内存优化。 -
初始化数组必须用const类型即常量,eg:
#define WORK_SIZE 1024 //用const int WORK_SIZE = 1024 //有可能会报错error: variably modified ‘work_area’ at file scope //char work_area[WORK_SIZE]; char work_area[WORK_SIZE];
The reason for this warning is that const in c doesn't mean constant. It means "read only". So the value is stored at a memory address and could potentially be changed by machine code.
-
linux下,LibreOffice中快捷键F9可以调出目录
-
当数组作为函数参数传递时,数组自动退化为同类型的指针
int GetSize(int data[]) { return sizeof(data); }
返回:4
解决方案:传递数组的引用int GetSize(int (&data)[4]) { return sizeof(data)/sizeof(data[0]); }
return:4,没什么实用意义。
非函数参数传递时,不退化,egint b[4] = { 3,6,7,10 }; int bLen = sizeof(b) / sizeof(b[0]);
bLen = 4;此时b作为sizeof()的参数时,没有进行其他的形参传递
-
void InsertNode(PListHead l, int val, int pos = 1);
默认的实参必须放在最后面;
定义时,不能重复定义int pos = 1了。