標籤:c 指標 數組
第八章數組
本章原書作者的意圖主要是跟指標進行比較,兩者的共同點以及區別。因為小弟我的彙編基礎為0,因此8.1.4指標的效率這一塊我實在是不明白。
本科時候學的數組絕對不會像現在一樣學數組,所以好好學數組!
它和指標在作為函數參數傳遞時是不是可以混用?
聲明數組和聲明指標在編譯過程中是否相同?
形參可以省略幾個下標,為什嗎?
char *a = "hello";和char a[]="hello";有什麼區別?
指向整型指標的指標和指向整形數組的指標有什麼區別?
總結:
數組名的值絕大多數的情況中是指向第一個元素的指標。除了sizeof:返回值為整個數組所佔用的位元組。&:返回一個指向數組的指標,都不是指向第一個元素的指標。
關於下標運算式 array[value]和間接訪問運算式*(array+(value))是一樣的。因此,下標不僅可以用於數組名,也可以用於指標運算式。
指標運算式效率更高,但是代碼的可維護性更加需要,因此,還是要以更清晰的表達為好。
指標在聲明時候值分配了容納指標的空間。
數組實際上是一個指標常量,當我們聲明一個數組時,它同時也分配了一些記憶體空間。
當數組名作為函數參數傳遞時,實際傳遞給函數的是一個指向數組第1個元素的指標。函數所接受到的參數實際上是原參數的一份拷貝,所以函數可以對其操作而不會影響實際的參數。
當指標參數做函數參數傳遞時,是可以修改原參數的。
但是當函式宣告的時候:
int strlen(char *string);
int strlen(char string[]);這樣是相等的。但也只有這樣是相等的。
關於初始化:
數組可以用一對花括弧包圍一組值來作為初始值列表。當列表值少於數組長度時,那麼將使用預設值進行初始化。
字串數組也可以用一種很像字串常量的快速方法進行初始化。
char *a = "hello";和char a[]="hello";
前者很明顯是個字串常量。後者“”裡面只是代表一個數組初始化列表。
多維陣列的儲存順序,是對最右邊的下標率先變化。
多維陣列名的值是一個指向它第一個元素的指標,也就是一個指向數組的指標。
當一個對位元組名作為參數傳遞給函數時候,第一維以後必須顯式得指明長度。這樣編譯器才能推斷出每一個子數組維數的長度。
關於指標數組:
兩種方式。一是矩陣形式:
char keyword[][10]=
{ "do",
"for",
"if"
};
這樣以來,這個矩陣將包含NUL終止符。而且每一行的長度相同。
char keyword[] =
{
"do",
"for",
"if",
‘\0‘
};
這樣一來,這就是一個指標的數組,每一行長度會自動調整,會多一個指標數組的大小空間。
警告:
1、當訪問多維陣列元素時,誤用逗號分割下標:
int a[3][4];//right
int a[3,4];//實際上只是聲明了a[4]
2、在一個指向未顯式聲明長度的數組的指標上執行指標運算。
int matrix[3][10];
int *p =matrix;//錯誤,matrix並不是指向整型的指標,而是一個指向整型數組的指標。
應該這樣聲明:int (*p)[10] = matrix;
編程提示:
1、一開始就編寫良好的代碼顯然比依賴編譯器來修正劣質代碼更好。
2、原始碼的可讀性幾乎總是比程式的運行時效率更重要;
3、只要有可能,函數的指標形參都應該聲明為const。
理由有三:一、一種更好的文檔習慣,有些人希望觀察函數原型就能探索資料不能被修改。
二、編譯器可以捕捉到任何試圖修改資料而意外產生的錯誤。
三、這類聲明允許向函數傳遞const參數。
4、在多維陣列的初始值列表中使用完整的多層花括弧能提高可讀性。
C和指標 (pointers on C)——第八章:數組(上)