C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作
阿新 • • 發佈:2018-11-07
我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。
我們喜歡在程式中使用指標代替陣列,因為變數指標可以遞增,而陣列不能遞增,因為陣列是一個常量指標。下面的程式遞增變數指標,以便順序訪問陣列中的每一個元素:
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* 指標中的陣列地址 */ ptr = var; for ( i = 0; i < MAX; i++) { printf("儲存地址:var[%d] = %x\n", i, ptr ); printf("儲存值:var[%d] = %d\n", i, *ptr ); /* 移動到下一個位置 */ ptr++; } return 0; }
我們可以看到指標中的陣列地址是 ptr = var 這種形式來賦值的。
輸出結果為:
儲存地址:var[0] = bf882b30
儲存值:var[0] = 10
儲存地址:of var[1] = bf882b34
儲存值: var[1] = 100
儲存地址:of var[2] = bf882b38
儲存值:var[2] = 200
而普通情況下在指標中儲存變數地址時,則是ptr = &var形式 含有 &取記憶體地址符號。
如下面這個例子,
#include <stdio.h> int main () { int var = 20; /* 實際變數的宣告 */ int *ip; /* 指標變數的宣告 */ ip = &var; /* 在指標變數中儲存 var 的地址 */ printf("Address of var variable: %p\n", &var ); /* 在指標變數中儲存的地址 */ printf("Address stored in ip variable: %p\n", ip ); /* 使用指標訪問值 */ printf("Value of *ip variable: %d\n", *ip ); return 0; }
編譯連結執行上邊的程式,我們能得到一下結果:
Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20
我們能看到兩種情況下的不同,有無&運算子。現在並不知道為什麼,暫且mark,希望儘快弄懂這為什麼會這樣子。