1. 程式人生 > >LinuxC預習第五章——陣列和指標

LinuxC預習第五章——陣列和指標

1、陣列和指標的不同
答:
陣列和指標在很多情況下是可以等效使用,但是本質還是不同的。比如在定義了一個數組 char a1[MAX]; 之後,不能宣告一個 extertn char *a1;

2、陣列使用常見一些問題

2.1 陣列下標都是從0開始的嗎?
答:
不都是。在使用陣列的時候要注意陣列的下標是從0開始的,可以人為弄一個從1開始的陣列,但是會留下很多隱患而且不方便閱讀。

2.2 陣列後面的第一個是否可以使用?
答:
可以,但是不推薦。陣列後面的第一個元素的地址最好不要特意使用,因為不知道里面是否已經儲存了內容,最後可能會造成無法預計的後果。

2.3 是否可以直接用sizeof看一個數組大小?
答:
不可以。無法通過sizeof()函式直接檢視一個數組的大小,因為陣列引數表示的是第一個元素的指標,這樣是無法直接使用的。

2.4 陣列和指正哪個更容易被訪問?
答:
大多數情況下是指標。
細節方面,陣列和指標進行比較,指標更容易被訪問。因為在訪問陣列的時候還要把資料型別大小和擺放的第幾位數i相乘,而乘法是比較花費時間的。
指標只會在開始的時候計算一次引數地址,此後在迴圈的時候直接呼叫,而且引數地址在迴圈中是不變的。所以相較於陣列,直接呼叫指標更節省計算量。

2.5 為何const說明不能定義一個數組的大小?
答:
C語言中,定義陣列必須要用一個常量表達式,例如#define MAX 512 。但是const int max=512; char buffer[max];是不可取的,因為初始化了的const int 變數不是一個常量表達式。然後這個用法在C++卻是合法的。

2.6 字串和陣列的區別
答:
兩者核心區別是,字串以"\0"作為結尾,而陣列不需要。

字串有些特殊的用法,例如"Hello,"world和"Hello,world"等效,因為NULL後面緊跟一個字串,編譯程式會把他們當做一個長字串處理。

“C的幽默”:簡單來講,給兩個不同的地址指標指向一個相同內容字串。理論上相同的內容應該分配不同的地址,但是編譯程式依舊可能為了省事只分配一個地址。

char *p="message";
char *q="message";
p[4] = '\0';

這段程式根據編譯方式的不同,*q所指的字串可能是"message"也可能是"mess"。

3 指標
3.1 指標的大小是多少?
答:
指標代表地址,32位處理器32位,4個位元組;64位處理器8個位元組。

3.2 指標的運算
指向相同陣列元素的指標是可以進行減法的和比較的。兩個指標可以進行是否相等的比較,結果無非兩種。

3.3 最多可以的指標層數
理論上可以使無限層。實際中,ANSI C標準要求任何編譯器起碼能處理12層的間接引用。

3.4 指標陣列和陣列指標
在定義陣列的時候在陣列引數前面加個‘*’號,則定義出指向指標的陣列,在“*引數”外面加個括號就構成了指向陣列的指標。

4 複雜指標
主要有一個右左法則,從最裡面括號開始看,跳出看右邊,看到底再往左邊看。結束後跳出一層括號重複上述行為。