2015年10月22日 星期四

[C] *與& 絲路整理

起因:

         C相關語言最大障礙不外乎就是指標(大陸用語叫指針),老實說我也從來沒真正搞懂過,很多時候都是要用時才去搞懂,寫的出來且正確就滿足了完全很偷懶的性格。
 (心裡murmur一下:github上面用C語言寫的專案還是很多阿,不學一下似乎不行。)


問題:


        所以這次我將統整一下*與&的絲路,方便以後我忘了直接看自己的blog就可以喚醒,希望可以達到多寫就會不用背境界。

        在開始之前,首先感謝course台灣大學C語言課程,並且此篇文章所有圖都是從那課程講義上部份圖黏貼過來,讓絲路更加清楚與了解。


1.
    int i ;
    int *iptr1;
    i=5;
    iptr1=&i;
 
2.
    &iptr=?
    *(&iptr)=?
    *iptr=?
    &(*iptr)=?

解決:

1.
    *變數:
    首先要先了解C語言上指針的資料變數
    int  *iptr1 其實亦可以看成
int* iptr1; int*這代表宣告一個指向"整數"的指針變數 所以我們可以說iptr1是一個指標變數, 而指標變數的值為另一個變數的記憶體位址,即iptr與一般的變數一樣 只不過它存儲內容為一個記憶體位址  
   &與*:
    這個常與*搞混,首先要知道如果是在宣告出現*時代表是一個宣告一個指標變數,
    可別之後走火入魔了在宣告中看到*在那想是拿值還是拿位置了(至少我是這樣      
     >////<)。

     當然都說到了走火入魔了,肯定要先講 &這個拉(哈)
     主要會先提&這個,是因為只要記好&是取該變數的地址
 
    &是取該變數的地址
    &是取該變數的地址
    &是取該變數的地址
    &是取該變數的地址

     而*則是取裡面(位置)值再去該位置取裡面的值,很饒舌對吧。。。。(也可能是我講的不好)
     拿例子來說說有助於更了解我在說什麼
   
這張圖 i為5且iptr為i的記憶體位址

i=5;
iptr=&i;

即 &iptr 為取iptr的位置 也就是說 &iptr =3778 377c。
     *(&iptr) 則先到iptr取這變數的位置再以這變數取裡面得值
             所以就是iptr位置為3778 377c 再從3778 337c位置取變數位置。
     *iptr為取iptr裡面得值(位置)再從這值去該值的地方去取這位址的值。
     &(*iptr)為取iptr裡面得值(位置)再從這值去該值的地方去取這位址的值
              5,再取這值位置3774。



結論:

其實仔細想想,理理絲路把*與&兩個想清楚,其實應該是不難

&是取該變數的地址。
*是取裡面(位置)值再去該位置取裡面的值。

















2 則留言: