1、32位windows操作系统中
int: 4字节
char:1字节
DWORD:4字节
WORD:2字节
LONG:4字节
float:4字节
double:8字节
BYTE:1字节
unsigned int:4字节
1字节是8位,1KB是1024字节,1B = 8b
float占4byte,精度是6~7位;double占8byte,精度是15~16位
char szTest1[100];
int iSize1 = sizeof(szTest1); //值为1 * 100 = 100
char *szTest2[100];
int iSize2 = sizeof(szTest2); //值为4 * 100 == 400
int iSize3 = sizeof(szTest2[0]); //值为4
char* pTest = new char[100];
int iSize4 = sizeof(pTest);//值为4 sizeof不知道new的情况,new是动态分配的,而sizeof是编译器就知道大小了
int iSize5 = sizeof(*pTest);//值为1
void Test1(char* p)
{
char szTest3[50] = {"hello,word"};
sprintf(p, "%s", szTest3);
}
//test1执行后,我们修改的是p所指向的内容,所以该函数出去后,指针p所值的对象的确是发生了变化的
void Test2(char* p)
{
p = new char[100];
}
//test2执行后,p是传值,所以p出去后,传入的指针依旧为空,指针参数我们修改其所指向的内容才有效果。
2、寻址问题
2.1、int a = 10;
栈中会分配一个int空间,里面存储着10
这个10在内存中的地址,比如是0x0001位置
2.2、int* pa = &a;
栈中也会分配一个int* 空间,里面存储着一个一个地址,即上面a的地址,0x0001,pa所占用的大小就是一个指针的大小
pa分配的空间可能在0xa001上
一下是堆空间,空间由操作系统来管理
|10| -- 这个地方在内存中的地址是0x0001
----
|xx|
|xx|
|xx|
|0x0001| -- 这个地方在内存中的地址是0xa001
|0xc001| -- 这个地方的内存中的地址是0xa002
以下是栈空间
|10| -- 这个地方的内存中的地址是0xc001,空间大小根据new分配的大小而定。空间由程序员来管理
2.3、int* pNewa = new int;
*pNewa = 10;
栈中先分配一个int* 空间,里面存储着一个地址,里面放着的值是0xc001,这个地址是一个堆中的地址
如果我们把pNewa = pa这样赋值了,即0xc001这个值谁也不知道了,那这块空间就不知道该怎么释放啦
至于堆中放置的值的类型,这个内存是不知道的,只有程序知道,根据不同类型,使用不同的寻址方式
比如a的寻址和pa的寻址方式肯定不同。
3、浮点数比较
浮点数做比较需要注意,不能用==,因为有小数点,会有精度缺失
if (fabs(price - p) < 0.00001)
来代替
if (price == p)
如9999.999在float中可能是999.99899998
也不能写成0.000001,因为0过多会导致该值变为9.9999999999999995e-007
4、防止多线程修改某变量值:volatile
5、强大的sprintf和sscanf(不是scanf)
sprintf将其它转换为string,sscanf将字符串解析转换成其它值
6、多重继承会导致传递this指针进行变化。
不管使用哪种指针调用哪类虚函数,传递给虚函数的this指针都是引入这个虚函数的类对象首地址
this指针变化需要看编译器对多重继承父对象的布局情况。
7、转换说明符
%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)
%c 字符
%d 有符号十进制整数
%f 浮点数(包括float和doulbe)
%e(%E) 浮点数指数输出[e-(E-)记数法]
%g(%G) 浮点数不显无意义的零"0"
%i 有符号十进制整数(与%d相同)
%u 无符号十进制整数
%o 八进制整数 e.g. 0123
%x(%X) 十六进制整数0f(0F) e.g. 0x1234
%p 指针 %s 字符串
%% "%"
8、.名字冲突问题
如果一个工程里面两个文件是名字冲突的,甚至里面代码差不多,类名也一样,会链接错误,以下是原因及解决
1、类名相同,只要使用不同命名空间,其实是没有关系的。这个不是链接错误的根本原因
2、文件名相同,就是因为这个原因了。因为同一个工程生成在了一个中间文件夹中,obj后缀,而且都是以文件名命名的。这样会有两个相同obj,所以肯定有一个被覆盖了
3、解决办法,vs支持设置obj名称,只要我们定一个规则,将在不同场合使用的相同文件,使用不同的obj名称就好了。
当时碰到这个问题了,也走到问题2了。然后就认为走不通了,就改文件名字,或则重新建立工程了。
moc_也有该问题,可以通过该方法解决。
9、宏定义展开
9.1、打开工程属性
9.2、选择C++下的'预处理器'
9.3、设置选项'生成预处理文件'为'不带行号(/EP /P)'或'带行号(/p)'
9.4、编译后在文件相同目录下有对应的*.i文件,该文件中宏都展开了
在工程下会有对应的*.i文件
预编译注意事项,举例如下,记得加空格呀
#define TEST \
static QEvent::Type EventType() \
{ \
static QEvent::Type iEventType = QEvent::None; \
if (iEventType == QEvent::None)\
{ \
iEventType = static_cast<QEvent::Type>(QEvent::registerEventType()); \
return iEventType; \
} \
else \
{ \
return iEventType; \
} \
};
10、常用命令
.注册dll:regsvr32
注册表:regedit
inf安装方式:RunDll32 advpack.dll,LaunchINFSection 你的inf信息(如D://test.inf),DefaultInstall
驱动安装方式,参考接口OpenSCManager
使用控制面板,添加硬件的方式,另外将驱动拷贝到system32下drivers下
pint 172.9.204.90 –l 1000 –t >D:ping.txt
tracert < ip>
netstat -ano:查看端口占用
ipconfig -all
dxdiag:关闭硬件加速