[英]C++ pointers, ++ operator behaviour
所以我在某處讀過,如果我們有一個指針p,並且一些i和j值一個接一個地定義,那么堆棧上的那些值將是一個接一個,但對我來說至少似乎不是這種情況。
int i = 10;
int j = 20;
int *p = &i;
p++;
(*p) = 30;
std::cout << i << " " << j << " " << (*p) << "\n" ;
相反,它將打印這些值10 20 30
如果我評論(*p) = 30;
而在*p
里面將是一個空地址。
我認為在這種情況下,++運算符會將我的引用從i
更改為j
,而(*p)
將更改j
的值,但事實並非如此。
所以我想知道他們的意思是什么?
代碼的行為未定義 。
指針算法僅在數組中有效。 您無法通過增加指向另一個對象的指針並取消引用該指針來訪問對象。 更詳細一點,定義了p++
(一個對象可以被認為是一個單獨的元素數組,你可以設置一個指向一個超過數組末尾的指針),但后續的解引用是未定義的。
我認為在這種情況下++運算符會將我的引用從i更改為j和t ....
那是錯的。 對於這個定義:
int i = 10;
int j = 20;
沒有規則可以使j
存儲在與i
相鄰的存儲器位置中。
此外,不要將指針(抽象概念)與它們建模的內容(物理內存地址)混淆。 對於大多數事情,將指針視為物理內存中的地址是很好的,但嚴格來說,它們不是。
C ++標准定義了指針的某些規則以及它們可以用它們做什么。 增加指向int
的指針以獲取指向另一個int
的指針,這不是其中一個規則! 請注意,即使在您的硬件存儲器中,兩個整數將存儲在相鄰的存儲器中,然后仍然將指針遞增到i
然后解除引用它是未定義的行為。
++
運算符將指向內存中的下一個位置而不是下一個變量。
如果你有int i[2] = {10, 20};
然后p++
將指向i[1]
即20
如果要擁有連續的內存位置,則需要聲明一個數組。 由於您的數據類型很小,因此libc會分配位置。 指針占據聲明變量周圍的空格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.