計算2進位數中1的個數,主要用到m&(m-1)
交換a,b不用中間變數,用異或:a=a^b;b=a^b;a=a^b
sizeof不是函數,它是個類似宏定義的特殊關鍵字,只要是指標,大小就是4.
靜態變數時存放在全域資料區的,而sizeof計算棧中分配的大小,是不會計算在內的。
sizeof(虛函數)(類)
class no_virtual
{
public:
void fun1() const{}
int fun2() const { return a; }
private:
int a;
}
class one_virtual
{
public:
virtual void fun1() const{}
int fun2() const { return a; }
private:
int a;
}
class two_virtual
{
public:
virtual void fun1() const{}
virtual int fun2() const { return a; }
private:
int a;
}
以上三個類中:
no_virtual沒有虛函數,sizeof(no_virtual)=4,類no_virtual的長度就是其成員變數整型a的長度;
one_virtual有一個虛函數,sizeof(one_virtual)=8;
two_virtual有兩個虛函數,sizeof(two_virtual)=8; 有一個虛函數和兩個虛函數的類的長度沒有區別,其實它們的長度就是no_virtual的長度加一個void指標的長度,它反映出,如果有一個或多個虛函數,編譯器在這個結構中插入一個指標( V P T R)。在one_virtual 和two_virtual之間沒有區別。這是因為V P T R指向一個存放地址的表,只需要一個指標,因為所有虛函數地址都包含在這個表中。
指標和引用:
int &reiv 這種寫法是錯誤的,引用不可為空,必須同時初始化。
const double di 這種寫法是錯誤的,const常量賦值時,必須同時初始化。
char c[]="hello world" 分配局部數組 對應記憶體中的棧
char *c ="hello world" 分配全域數組 對應記憶體中的全域地區 全域地區的值是不能進行修改的
scanf用法 ,注意裡面的參數是輸入數的地址,而不是輸入數本身
scanf(格式控制,地址表列)
int scanf(char *format[,argument,...]);
“格式控制”的含義同printf函數;“地址表列”是由若干個地址組成的表列,可以是變數的地址,或字串首地址。