*x=i
和x=&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;
*x=i
和x=&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;
*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
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.
*x=i;
取消引用指針x
並分配i
。
x=&i
使得指針x
指向變量i
。
*x = i
更改存儲在存儲在x
中的地址處的值。在你的情況下,未經編輯,會崩潰,因爲地址x
可能是垃圾,可能是NULL
。你需要一個malloc()
或new
什麼的。
x = &i
更改存儲在x
中的地址,這樣就是變量i
的地址。在你的例子中這是完全安全的。
那麼,當你說
*x = i
你說:使變量x點i值。 當你說
x = &i
你是說讓地址X點到我的地址。 我想你應該能夠自己找出其他的!
*x=i
將存儲在由x
指向的存儲器位置中的值更改爲等於存儲在i
中的值。
x=&i
更改內存位置x
指向i
的內存位置。
x=i
是錯誤的。你很可能會遇到段錯誤。
*x=*i
是錯誤的。您不能取消i
,因爲i
不是指針。
*x=&i
(實際上,更適當地,*x=(int)&i
)將存儲的i
的存儲器位置中的存儲器位置的整數通過x
指向。
*x = i
這實際上分配的i
到所述存儲器位置由x
指向的值。
x = &i
這將變量i
的地址分配給指針變量x
。 x
應該是一個指針。
當你做x = i
時,這會給你一個運行時錯誤,因爲你試圖錯誤地分配一個不屬於你的進程地址空間的地址(在本例中爲2
)。要成功完成此操作,i
也應該是一個指針,並且必須指向地址空間中的地址。
當你做*x = *i
,在你的情況下會再次出現錯誤。如果i
是一個指針,則x
指向的地址將獲得i
指向的地址處的值。
*x = i
給x指向的內存地址賦值2。請注意,這可能會崩潰,因爲x尚未通過malloc初始化爲內存地址,也未分配給緩衝區或堆棧變量的地址。
x = &i
將指針x
指定給變量i
的地址。
x = i
會將指針x
指定爲2
的值,該值很可能指向無效的存儲器地址並且需要強制轉換。
*x = *i
將取決於當前值x
。而且由於i
不是一個指針,所以不能對其進行解引用。
*x = &i
會將地址i
寫入x指向的內存地址,這取決於前面的代碼。如果您沒有將x分配到有效地址,它可能會崩潰。
這些調用中的一部分需要強制轉換才能在語法上正確。
確定如此'int * x = NULL;'會解決這個問題嗎? – ritratt
@ritratt之後,'* x = i'的行爲仍然是未定義的,因爲您不允許取消引用空指針。 – hvd
改變j的值而不直接訪問變量j。頭腦風暴。 – ritratt