陣列和指標的剖析
指標到底是什麼呢。指標其實可以比作相當於乙個暫存器,我們暫且可以這樣理解。因為乙個暫存器中一般存放的都是乙個4位元組的記憶體位址。所以我們的指標同樣也是存放的乙個記憶體位址。我們其實在訪問指標就是間接的訪問記憶體位址。 轉為彙編中相當於 dowrd ptr [指標] 。這樣訪問的就是指標位址中儲存的資料。
很多人說指標和陣列時相同的,因為他們認為 例如。
char *string = "hello world";
他們通過string [0] 就可以訪問到字元』h』。其實這時存在乙個間接的作用。這裡我們假設string的記憶體位址時 00405128。例如這裡我們通printf("%c", string[0])。 那麼此時程式則會將 dword ptr [string+1] 壓入堆疊。 不過因為堆疊一般是通過暫存器操作的所以 mov eax ,dword ptr [string+1] 。因為一般我們彙編中要進行訪問記憶體中的資料的時候,資料位址需要加上 。 例如 mov eax, 3 和 mov eax, [3] 。顯然不同,前者是將立即數3傳遞到eax暫存器中。後者是將位址3中開始的32位值 傳遞給eax暫存器。因為一般我們寫匯程式設計序時候用的是。其實彙編**預設為 dword ptr 。
上面說了這麼多,我想你應該明白指標的作用了吧。訪問指標實質是訪問指標位址中存放的32位數值的位址中的資料。
所以大家這裡千萬不要認為,既然我們平常可以用初始化乙個字串指標。例如
char *string = "hello world";
那麼就可以通過strcpy等函式操作。
例如strcpy(string, 』"test")。
這裡是錯誤的。為何? 因為我們之前的hello world是存在於資料段的。載入記憶體後此片區域是不可寫的。只有唯讀的許可權。所以此時操作就會報錯。
陣列就不同了。陣列本身就是代表的乙個位址。
例如char string = ;
string 本身就是代表的乙個位址。 那麼此時訪問的就是string的記憶體位址。而不像指標,還需要取得指標中存放的32位位址值。
例如 通過printf("%c",string[1]); 那麼此時訪問的就是直接將 string + 1壓入堆疊 。當然這裡我只是簡單的乙個表達,實際上因為我們的函式都是通過堆疊分配記憶體空間的,這裡會取得我們string 在堆疊中的值從而進行對他訪問。
char string = ;
strcpy(string, "test");
為何可以訪問?
因為我們在宣告string陣列後是通過堆疊分配記憶體的。string 此時就存在於堆疊中。因為我們都知道陣列是以連續的記憶體空間。所以string位址中存放的就是hello world 。因為我們是存在於**區,所以擁有可寫許可權,從而可以進行寫操作。
這裡在舉一些很要緊的例子。例如
char *string;
scanf("%s", string); //錯誤,因為我們的string指標在堆疊中分配記憶體,因為此時string位址中存放的是堆疊隨即分配的ascii數值,所以此時在進行scanf從緩衝區取得輸入字串並儲存到相應的記憶體位址就會錯誤。因為這個string 指標中的記憶體位址是堆疊隨即分配ascii數值的。根本就定位不到記憶體空間。所以就會報錯。
C語言高階剖析 32 陣列指標和指標陣列
例如 int array 5 的型別為 int 5 我們經常會碰見這樣的情景 問 這裡定義的陣列是什麼型別的?答 int 型。這樣的回答就是概念不清晰了,陣列的型別包括元素型別和陣列大小,回答 int 型只回答了元素型別,正確的答案是 int 5 c 語言通過 typedef 為陣列型別重新命名,如...
c語言深度剖析 34 多維陣列和多級指標
1.指向指標的指標 int main 2.問題3.程式設計實驗 include include int reset char p,int size,int new size free p 釋放原來申請的空間 p pt 指標指向新的記憶體空間 else return ret int main free...
C語言 指標陣列和指標陣列
本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...