1.LPCSTR被定义成是一个指向以'\0'结尾的常量字符指针。 LPWSTR是wchar_t字符串。 例子: LPWSTR lpwstr = NULL。 LPWSTR lp = _T("asdfasgaf")。
2.之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。
3、
#ifndef _A_H_
#define _A_H_
#endif
避免文件重复包含。
4.NBTS为null-byte-temnated string的缩写,表示以空字符结束的字符串。
5、system("cls");//清屏
6、malloc标准格式:
char* a;
a = (char*)malloc(50);
if(nullptr == a)
{
return;
}
memset(a,0,50);
free(a);
和new的区别:
new做两件事:分配内存和调用类的构造函数,delete是:调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。
7.在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:
可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数
由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参
8. #pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。
9.__declspec(dllexport)用于导出符号,也就是定义该函数的dll;__declspec(dllimport)用于导入,也就是使用该函数。因为这个头文件既要被定义该函数的dll包含,也要被使用该函数的程序包含,当被前者包含时我们希望使用 __declspec(dllexport) 定义函数,当被后者包含时我们希望使用 dllimport。
10.goto可以直接跳出最外层循环,跳到需要的地方,不过要尽量避免使用。
11.在字符串前加一个L表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。如果在字符串前加_T,则编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式 。
12.首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点:
1、sizeof是一个关键字,而strlen确实一个函数。
2、sizeof求的是字节长度,而strlen求的却是实际长度。
比如int a=1;sizeof(a)==4而strlen(a)=1
3、sizeof求的是分配过来的长度,而strlen求的却是实际使用的长度。
比如:char a[30]="abcd";
sizeof(a)=30;而strlen(a)=4;
4、strlen求的长度是以'\0'结束的。
比如char a[30];strlen(a)的结果是不定的,而sizeof(a)=30;
同理:char a[30]={'a','b','c'};对于strlen来说也是不定的,而sizeof却是30。
5、sizeof是在编译是计算的,而strlen是在运行是计算的。
13.ASCII和Unicode的区别:
14.被_stdcall修饰的函数,其参数都是从右向左通过堆栈传递的, 函数调用在返回前要由被调用者清理堆栈,一般被用于回调。
15.内联函数编译器将指定的函数体插入并取代每一处调用该函数的地方,从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。
16、使用#pragma once可以避免文件被重复包含,但是它不支持跨平台,只需在头文件开头加上#pragma once即可。
17、正如我们可以从语法中得出的那样,整数文字有四种类型:
· 纯十进制,必须以非零数字开头。
· 八进制,任何以0开头的数字(包括纯0)。
· 二进制,需要前缀0b或0B。
· 十六进制,需要前缀0x或0X。
18、将一个整形地址强转成一个地址:int *p = (int*)0x123456。
19、如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。
20、~是按位取反运算,与反码是不同的。反码法规定,正数原反补码相同,负数的反码为原码除符号位以外取反。
21、int a[10];这样就会开辟10*4字节的内存空间,是在你调用这个函数的时候,这个空间会存在于函数栈上。栈上的对象会在函数退出时失效。如果在.h文件,则会在new对象时开辟。
22、为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。
23、如何求幂次方?包含math.h头文件。利用Pow函数可以直接求数的次方,我们可以知道函数有两个参数,第一个参数为底数,第二个参数为指数,分别将代表的变量放入函数中。
24、//合法的二进制
int a = 0b101; //换算成十进制为 5
int b = -0b110010; //换算成十进制为 -50
int c = 0B100001; //换算成十进制为 33
25、
"./":代表目前所在的目录。
" . ./"代表上一层目录。
"/":代表根目录。
26、C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。
27、出现curdump或者double free异常,一般是由于多重释放,或者申请的内存空间不够,导致空间踩踏。
28、用typedef为现有类型创建别名,定义易于记忆的类型名
typedef定义函数指针例如:
typedef void (*func)(void);
另外一个好处就是利用
typedef int (*func)(void);
可以减少函数指针定义的繁琐,如果没有加上面的定义的话,当你函数要定义的时候需要的就是
void (*fn)(void);
这样才是表示一个函数指针,而如果有了
typedef int (*func)(void);
则不用那么麻烦,直接就可以用
func fn;
就表示是函数指针.
*int (pf)(int,int)等价于fun_TEST pf
29、声明和定义的区别。
变量的声明是用来告诉编译器变量的名称和类型,而不分配内存。
例如:
extern int var; // 声明
extern int ble =10; // 定义
typedef int INT; // 声明
struct Node; // 声明
上面代码中,语句 extern int var;表示 var 在别的文件中已经定义,提示编译器遇到此变量时在其它模块中寻找其定义。语句 extern int ble = 10;表示定义了变量 ble,这一点需要注意。
注意:即使是 extern ,如果给变量赋值了,就是定义了。
定义是为了给变量分配内存,可以为变量赋初值。
int value ; //声明 + 定义
上面代码中,变量名为 value,类型为 int ,分配 4 字节的内存(不同编译器会有差异)。
通常变量的定义和声明是同时发生的,注意:extern 变量类型 变量名 仅是声明。
区别
变量/函数可以声明多次,变量/函数的定义只能一次。
声明不会分配内存,定义会分配内存。
声明是告诉编译器变量或函数的类型和名称等,定义是告诉编译器变量的值,函数具体干什么。
30、注册更多的是一个中间层,管理底层驱动与上层应用之间的关系。
31、参数的默认参数只需要在声明中赋值一下即可,int A(int a,intb=1);