C/C++ 筆記 -- 基本概念(2)

多維數組
       一個多維數組在語義上並不等價於一個指向其元素類型的指針,相反他等價於一個“指向數組的指針"
int b[3][4]     <=> int(*const b)[4]
int c[3][4][5]  <=> int(*const c)[4][5]


char *p1 =  new char[5][3];           // ERROR!語義不等價
int *p2 = new int[4][5];              // ERROR!語義不等價
char (*p3)[2] = new char[5][2];       // OK!退化第一維,語義等價
int (*p4)[5][7] = new char[20][5][7]; // OK!退化第一維,語義等價 

同理不能用:
delete [][]p3;
delete [][][]p4
來釋放,正確應該是:
delete []p3;
delete []p4;

字符串,字符數組,字符指針
字符數組:就是元素爲字符(char)類型變量的數組。
字符串:以字符‘\0’結尾的字符數組。或者說存放字符常量的字符數組。
字符指針:執行字符類型變量的指針。
字符串函數(strlen,strcpy,strcmp等等)的參數類型爲字符指針,但函數實現默認實參爲字符串變量
當字符指針str作用在標準輸出函數printf("%s",str), cout << str <<endl;也認爲實參爲字符串變量。

位域
C中位域必須是int, unsigned int, signed int ,C++還允許是char ,long
位域中定義非具名位域成員,相當於佔位符。長度爲0的位域用於迫使下一個成員從下一個完整的機器字(word)
開始。位域成員不能取地址(&),位域對象(變量)是可以的。

結構體/類的成員對齊
       理解這句話:編譯器在考慮一個類型的大小的時候不僅要考慮一個對象的對齊要求,還要考慮該類型
       數組的對齊要求。儘量按照從大到小的順序從前向後依次聲明數據成員,並吸納尾填充來提高內存使用效率。
       程序設計時,庫(動態庫,靜態庫)和可執行程序之間,成員的對齊方式要一致。

頭文件包含的合理順序

在頭文件中:
1)包含當前工程自定義的頭文件;
2)包含第三方程序頭文件;
3) 包含標準頭文件;
在源文件中:
1)包含該源文件對應的頭文件;
2)包含當前工程自定義的頭文件;
3)包含第三方程序頭文件;
4) 包含標準頭文件;

#和##運算符
        #叫做構串操作符,修飾帶參數的紅的形參,它將實參的字符轉成字符串常量。
#define STRING(x) #x #x
char *s = STRING(abc); // *s="abcabc"
#define TEXT(x)  "class" #x
char *s = TEXT(abc); // *s="classabc"

      ##合併操作符,將出現在其左右的字符序列合成一個新的標識符
#define CLASS_NAME(name)  cl_##name
CLASS_NAME(event) 等效cl_evnet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章