指標基本概念與基本運作

其實在之前已經使用過指標的功能,只是沒有明確的顯現出來。
當主程式要把陣列傳遞給函式時【主a[5];sum(a,5);函int sum(int b[ ],int n)】,其實主程式傳遞給函式的就是傳遞a陣列第一個儲存位置在記憶體的"位址",先前有提到如果改變函式中接收的a陣列記憶體位址的b陣列,一旦b陣列內容改變,主程式的a陣列也會改變,其實這就是指標的基本概念之一。
(type *)指標:可儲存記憶體位置型別(int *b)
(&)取址運算子:取得指定變數的記憶體位址(b=&a;)
(*)間接運算子:取得該記憶體位址的內容值進行存取(*b=10,所以a變10)

基本指標運作:
int a=69;
int *b=&a;
int r=*b;
表示式為a,型態為int,內容值為69;
表示視為&a,型態為int*,內容值為00061FE1XX(記憶體位址);
表示式為b,型態為int*,內容值為00061FE1XX(記憶體位址);
表示式為*b,型態為int,內容值為69;

至於指標上的基本運作,以下會直接用編碼來記錄。

int main(){
int a=69,c;               //a為int型態內容值69;
int *b;//int* b皆可  //為int*型態用於紀錄記憶體位址;
b=&a;                     //b為int*型態,用於儲存記憶體位址
                                       //&a為int*型態, 內容為00061FE1XX(記憶體位址);
c=*b;                      //c為int型態//*b為int型態
*b=96;                    //*b為int型態
printf("A:%d",a);  ////列印後: A:96
printf("B:%p",b);  ////列印後: B:00061FE1XX
printf("C:%d",a);  ////列印後: C:69
return 0;
}

要注意上面編碼紅色部分,因為在宣告時用int *b,之後的b都是int*型態

所以:
int c=100;
int a;
int* b;

a=c     (O) (int) = (int)
b=c     (X) (int*) = (int)

a=&c  (X) (int) = (int*)   //&取址
b=&c  (O) (int*) = (int*) //&取址

另外:
c= *a;//int整數型態的變數前面不可以放*【錯誤】
c= *b;//*號後面放的一定是記憶體位址,而b型態就是int*【正確】
int *b和c= *b這兩個*在C裡面是不同意義的
int *b的*是宣告為int*型態。
c=*b的b是個指標(宣告時定義int*),而*是透過指標b(int*)的儲存位址進行存取(上面藍色部分成功取得並儲存c的記憶體位址)
簡單說是存取指標b所指向的位址(b的值是儲存記憶體位址)(上方色部分指向c)
再簡言之就是b=&c,而c=*b;所以c=c。
很饒舌,有疑慮還是要直接用編碼執行比較清楚,這邊一定要搞懂。

留言