1、在for和while等循环语句中{}两者之间定义的变量,作用域只在大括号之间,虽然反汇编后看到的内存位置不变,但是要正确理解其含义,即每一次循环后该变量的作用域和生命期结束,该变量释放消失,下一次开始循环该变量重新建立获得生命期,就像函数中定义的局部变量一样,而不是该变量再循环过程中不变。
2、如下代码是错误的float f=0.1;(int)f=9;为何呢?因为强制转换后的变量存在于以临时存储区域,该区域至刻度不可写。
3、声明和定义不完全是一回事,定义用于分配存储空间,在一个程序中一个变量只可以有一个定义。声明是向程序表明类型和名字,定义也是声明。可通过关键字extern只声明而不定义当声明为定义时才可有初始化式。
4、declspec(dllinport/dllexport)与c还是c++有关而处理方式不同。在c文件中,只要导出的与导入的名字一样就能完成连接,与类型无关。但在c++中,不仅与名字有关,而且与类型名称也有关,观察得知类型名与名字同时参与了名字改编。尤其要注意结构体,这意味着,导入与导出的结构体类型名字也要一样,但是用typedef和define重定义过后的不一样不要紧,也就是说原始类型名要一样。
5、数组的首元素值指针值与指向数组的指针值一样但类型不一样,值一样是因为数组首元素地址也就是数组的起始地址,类型不一样很好理解了。
6、const int* p与int* const p不一样,前者是指向const对象的指针,后者是指针的值是常量。
7、函数名与函数指针的不同。两者实质上都是地址,但是函数名是指针常量即一个类型为指针的数,后真是一个指针变量。
8、指针常量与常量指针不同,从文字上即可看出,指针常量重在常量,常量指针重在指针。
9、赋值语句也有返回值。如if(int i=9),这样理解:i=9是一个语句,它完成了对i的赋值,但同时返回了一个9的值,该语句等于是if(9)。
10、switch() int i=9;case: ;case: ;default;这样的语句是错误的,因为int i=9永得不到执行,而把它放在case语句中C++也是不允许的。
11、函数参数的传递可以在这样理解,即形参为一个变量,进行如形参=实参的赋值,这样形参与实参的类型匹配就如普通的赋值一样了。
12、返回非引用类型实际上是把返回值初始化在调用函数处创建的临时对象,术语为temporary object。引用型的是直接返回返回对象。
13、作用域的查找规则如下,现在包含该变量的作用域中查找,找不到再在包围该作用域的作用域中查找。在类中更为典型。
如:int a;
class c{
int a;
void f();
};
void c::f()
{
int a;
a=0;
}
这样的话匹配的是f函数中的局部变量a,如果无这个局部变量,则匹配类中的成员变量a,两者皆无的话,则匹配全局变量a。
14、this指针的问题。众所周知,this指针隐含的出现在成员之前,不仅是成员变量,也有成员函数。
如
class c{
int a;
void f();
void x();
};
void c::f()
{
a=0;
x();
}实际上是this->a;this->x();一般书上只说对成员变量,但也应对成员函数。如果x为虚函数,则就必须有this指针进行调用才合适。
15、static成员在继承中不进行继承,即不管被继承几次,内存中只有一份static成员。
16、类类型之间的转换。两个类进行赋值,如果同类型的话,即直接复制。如果为父类=子类,则将子类中的父类部分赋给父类。如果为子类=父类或两个无任何继承关系的类,则需用强制转换,结果是将一个类的全部强制赋给另一个类,而不是部分赋值。(未完结,待续)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)