2012-10-08 192 views
0

*x=ix=&i有什麼區別?* x = i和x =&i之間的區別是什麼

代碼:

int i=2; 
int *x; 

*x=i; //what is the difference between this... 
x=&i; //...and this?? 

//Also, what happens when I do these? Not really important but curious. 
x=i; 
*x=*i; 

回答

5

*x=i; //what is the difference between this...

此的i的值分配給存儲在所述一個的整數ddress指向x

x=&i; //...and this??

此的i的地址分配給x

請注意,在您的示例中,x未分配,因此*x=i的行爲未定義。

這裏是一個更好的說明:

int i = 2, j = 5; 
printf("%d %d\n", i, j); // Prints 2 5 
int *x = &j; 
*x = i; 
printf("%d %d\n", i, j); // Prints 2 2 
+0

確定如此'int * x = NULL;'會解決這個問題嗎? – ritratt

+0

@ritratt之後,'* x = i'的行爲仍然是未定義的,因爲您不允許取消引用空指針。 – hvd

+0

改變j的值而不直接訪問變量j。頭腦風暴。 – ritratt

2
int i=2; 
int *x; 

*x=i; // x is not initialized, this is undefined behavior 
x=&i; // this assigns the address of i to x 

*x=&i; // is invalid C. You cannot assign a pointer to an 
     // integer without an explicit conversion. 
1

*x=i;取消引用指針x並分配i

x=&i使得指針x指向變量i

1

*x = i更改存儲在存儲在x中的地址處的值。在你的情況下,未經編輯,會崩潰,因爲地址x可能是垃圾,可能是NULL。你需要一個malloc()new什麼的。

x = &i更改存儲在x中的地址,這樣就是變量i的地址。在你的例子中這是完全安全的。

1

那麼,當你說

*x = i 

你說:使變量x點i值。 當你說

x = &i 

你是說讓地址X點到我的地址。 我想你應該能夠自己找出其他的!

2

*x=i將存儲在由x指向的存儲器位置中的值更改爲等於存儲在i中的值。

x=&i更改內存位置x指向i的內存位置。

x=i是錯誤的。你很可能會遇到段錯誤。

*x=*i是錯誤的。您不能取消i,因爲i不是指針。

*x=&i(實際上,更適當地,*x=(int)&i)將存儲的i的存儲器位置中的存儲器位置的整數通過x指向。

1

*x = i 這實際上分配的i到所述存儲器位置由x指向的值。

x = &i 這將變量i的地址分配給指針變量xx應該是一個指針。

當你做x = i時,這會給你一個運行時錯誤,因爲你試圖錯誤地分配一個不屬於你的進程地址空間的地址(在本例中爲2)。要成功完成此操作,i也應該是一個指針,並且必須指向地址空間中的地址。

當你做*x = *i,在你的情況下會再次出現錯誤。如果i是一個指針,則x指向的地址將獲得i指向的地址處的值。

1

*x = i給x指向的內存地址賦值2。請注意,這可能會崩潰,因爲x尚未通過malloc初始化爲內存地址,也未分配給緩衝區或堆棧變量的地址。

x = &i將指針x指定給變量i的地址。

x = i會將指針x指定爲2的值,該值很可能指向無效的存儲器地址並且需要強制轉換。

*x = *i將取決於當前值x。而且由於i不是一個指針,所以不能對其進行解引用。

*x = &i會將地址i寫入x指向的內存地址,這取決於前面的代碼。如果您沒有將x分配到有效地址,它可能會崩潰。

這些調用中的一部分需要強制轉換才能在語法上正確。

相關問題