2016-09-29 53 views
0

我目前正在學習C並達到了這個地步(哈哈...),我正在學習指針。我想我已經對他們有了一些瞭解,並且我認爲我瞭解他們的概念。好老的新手殺手:指針

如果我有一個指針命名爲「C」,並命名爲「一」與值爲5的整數,然後執行以下操作:

*c = a; 

我設置的指針c的值(因爲我使用asterik符號)到a的值,這是5.所以* c之後是5,c等於a的內存地址 - 正確?

大約那麼下面的內容:

c = &a; 

我只是傳遞中的值存儲到指針的內存地址。 兩種操作是否相同?從我的角度來看,他們也是這樣 - 是對的嗎?

+0

「我設置了指針c」=> NO的值。您可以設置c指向的值。指針c的值是它指向的地址。 – Tim

+0

您可能想要了解運算符'&'的地址以及解引用運算符'*'如何工作,以及後者與類型/變量定義中使用'*'的方式不同。 – alk

+0

特別是「後者不同於在類型/變量定義中使用a *」讓我感到困惑。現在清理了!謝謝。 – gusgxrha

回答

1

差不多。請記住,你所說的第一個問題是:「拿出'c'指向的內存部分並使其等於5」。因此,在將其設置爲5之前,您需要分配內存的哪部分。因此,實際上有兩個不同的變量('a'和'c'指向)。

在第二種情況下,您只是將'c'指定爲'a'。所以是的,你會再次指向一個值5,但現在你只有一個變量'a'和一個指向內存相同空間的指針

+0

非常感謝您的幫助! – gusgxrha

1

如果我有一個名爲「c」的指針, 「a」的值爲 爲5,我做了以下操作:

*c = a;我將指針c的值(因爲我使用的是星號符號)設置爲a的值,因此它的值爲5.所以* c是5之後 和c等於一個內存地址 - 正確?

沒有,那c指向變量的內容將得到變量a的價值。指針本身沒有改變。

大約那麼下面的內容:

c = &a;我只是傳遞中的值 存儲到指針的內存地址。

這改變指針c本身指向可變a

兩個操作是否相等?從我的角度來看,他們也是這樣 - 是對的嗎?

不,第一個更改c指向的值,第二個更改指針指向的內容。

一個重要的區別是第一個(*c = a)要求c有效 - 即實際指向一個對象)。第二個使c成爲一個有效的指針,覆蓋其先前的值。

+0

所以基本上第二步還包括第一個也是對的?因爲如果我將使用&a的地址分配給指針,我可以使用asterik操作符訪問地址中存儲的內容 - 正確? – gusgxrha

+0

不是真的,因爲第一個更改指針指向的另一個對象,而第二個「復位」指針。 '* c'在兩者並不重要之後都是5的事實,因爲它們是不同的五。 – drRobertz

+0

好吧,明白了。非常感謝你。 – gusgxrha

4
*c = a; 

您將結束與此:

+---+  +---+ +---+ 
| A |  | C | | ? | 
+---+  +---+ +---+ 
| 5 |  | @ | | 5 | 
+---+  +-+-+ +-+-+ 
      |  ^
      |  | 
      +--------+ 

Howerver有:

+---+  +---+ 
| A |  | C | 
+---+  +---+ 
| 5 |  | @ | 
+---+  +-+-+ 
^  | 
    |   | 
    +---------+ 

所以在這兩種情況下:

c = &a; 

你結了,你將有*c == 5,但不同的是什麼c指向

+0

太棒了!非常感謝! – gusgxrha

+1

我發現指針只需要用簡單的英語/ NaturalLanguageX來描述它們,而不是僅僅使用它們。通過使用這種可視化,可以巧妙地避免陷阱。做得好。 – Will

+1

@會:謝謝! :d –

0

如果您使用的是*c=a,它會將內存地址分配給內存地址c,如果更改值a它將不會影響c的值。

而如果你使用c=&ac開始指着a內存地址和您更改的a值就會改變,其中c指向的值(*c)。