2013-04-17 19 views
0

我無法理解&運營商的運作方式及其重要性。爲什麼地址運算符(&)對於一個數組來說很重要?

我發現這個例子在線:

#include <stdio.h> 

void main() 
{ 
    int a = 10; 
    printf("\nValue of n is : %d" ,n); 
    printf("\nValue of &n is : %u", &n); 
} 

輸出:

Value of n is : 10 
Value of &n is : 1002 

首先,爲什麼用&n打印出這兩個額外的數字?

其次,爲什麼這很重要?

+3

你的程序處理不同類型的數據有未定義的行爲。 '%u'需要一個'unsigned int',而不是'int *'。 –

+4

在你的問題中沒有任何數組。 – dreamlax

+3

也沒有'n'的定義。 –

回答

0

&運算符是「運算符的地址」。所以&a意味着address of a,而不僅僅是一個值。

這是告訴你的是,地址是1002(或作爲dreamlax指出,很可能不是真正的地址,由於與如何使用printf的怪異),即使值爲10。請注意,這兩個值之間沒有嚴格的相關性,您可以輕鬆地擁有a=121765&a=494260

瞭解變量的地址可以讓您操縱變量「引用」或「指向」的特定值/對象。如果你想要一個函數來操作那個特定的值/對象而不是操作一個副本,你應該傳遞這個變量的地址。

看看下面的代碼(不一定是完整代碼):

int main(void) 
{ 
    int a = 10; 
    doIt(a); 
    printf("after doIt: %d", a); 
    doItByReference(&a); 
    printf("after doItByReference: %d", a); 
} 

void doIt(int val) 
{ 
    val = 13; 
} 

void doItByReference(int *val) 
{ 
    *val = 15; 
} 

調用doIt經過a持有的價值,並在不同地址的新整數變量被複制到它該值。該功能可以自由對該副本進行任何更改,並且在原始a變量中不會看到任何修改。

但是,撥打doItByReference傳遞的地址爲a。對給定地址處的值所做的任何更改都會反映爲對a所做的更改。

如果您想對給定對象進行更改並將這些更改反映到原始副本中,這本身就很有用。但是,即使您不想修改原始副本中的值,這也是非常有用的性能,因爲您可以避免必須複製任何值。對於一個簡單的int,可能是4個字節(確切的值不重要),這是不重要的。

但是,說你有一個struct這是字節數以百萬計:

struct LargeStruct 
{ 
    int buffer[134217728]; 
}; 

void doIt(LargeStruct buffer) 
{ 
    // ... do something 
} 

void doItByReference(LargeStruct *buffer) 
{ 
    // ... do something 
} 

這一次,以doIt每次調用將不得不復制整個LargeStruct對象,它是數百萬字節,這裏,作爲對doItByReference的調用只需使用現有對象,並且不需要複製。

+0

謝謝你的回答!我想我明白操作員現在做了什麼。你能告訴我爲什麼它很重要嗎?是不是使用運算符的含義?謝謝 – user2247143

+0

增加了兩個爲什麼使用引用會有用的例子。希望我的語法正確並且沒有混合使用任何C++特定的東西。 – helloworld922

+0

這是非常豐富的信息。 – user2247143

0

n是一個變量。它代表了一種價值。
& n是對n的引用。它表示n是存儲的內存中的地址。

至於爲什麼是很重要的:

當您通過C中的數組,該功能通常預期的指針。 (即:int *而不僅僅是int)。
如果你將'n'傳遞給函數,編譯時就會抱怨,因爲類型不匹配(n = int,函數需要int *)。
如果你通過& n,但是你傳遞的地址是'n',這是函數期望的。

0

要打印出C中的地址,通常應使用%p而不是%u

注意%p以十六進制數打印出地址。

+2

從技術上講,'%p'以特定於實現的方式打印指針。通常它是十六進制的,但沒有必要說它必須是。 – dreamlax

+1

請注意,使用'「%p」'指針也應該轉換爲'void *'。 – effeffe

0

運算符地址&返回以下變量的內存地址。這是重要的,因爲:

  1. 它允許參照大內存塊(結構,數組,動態分配的非結構化的存儲器區域)具有重量輕處理

  2. 它提供手段來訪問的數據結構的內部表示

  3. 它使我們能夠通過相同的接口

相關問題