您的位置:首页 > 编程语言

编程经验总结

2015-03-18 08:46 197 查看
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:关闭硬件加速
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: