[英]How can a C pointer of type int hold a memory address, given that a byte memory address is not of type int?
我一直在尋找“ C語言中的指針:何時使用與號和星號”的答案,並對示例int *p2 = &i;
感到困惑int *p2 = &i;
(根據丹·奧爾森的回答)
i
的地址不是整數,就像0x02304這樣,對吧? 那么我們如何將其放入p2
呢? 給定一個字節內存地址不是int類型,int類型的C指針如何保存一個內存地址?
謝謝!
PS對於這一點感到困惑的人,我發現另一個有用的線程(盡管它沒有為我回答這個問題)是“如果不是內存地址,C指針到底是什么?”祝您好運。
我的地址不是整數,就像0x02304這樣,對吧?
指針是保存內存地址的變量。 一個地址,就像您的房屋的地址一樣,是分配給內存字節位置的整數。
int類型的C指針如何保存一個內存地址
在您的示例中, p2
是類型為pointer-to-int的變量。 它是一個指針-內存地址-您聲明指向將存儲int
變量的內存。
p2
不是一個int
,它是一個指向int
的指針。 這樣,它可以保存一個int
變量的地址。
語法int *p2;
定義一個指向int
的指針。
用&i
初始化p2
將變量i
的地址存儲到p2
。 修改p2
指向的值將修改i
的值。
以下替代語法都是等效的:
int *p2 = &i;
int * p2 = & i;
int * p2 =& i;
int*p2=&i;
int* p2 = &i;
首選語法為int *p2 = &i;
因為它避免了在同一行上定義多個變量時的常見誤解:
int *p1, *p2; // defines 2 pointers to int
int *p1, p2; // p1 is a pointer-to-int, whereas p2 is an int
在類型上加上*
會使后面的定義非常混亂:
int* p1, p2; // p1 is a pointer-to-int, whereas p2 is an int
因此,強烈建議不要在同一行上定義具有不同間接級別的變量。
我認為int *p2 = &i;
的原因 令人困惑的是同時聲明和實例化以及間距的組合效果。 我會解釋。
通常,對於指向整數的指針p2
和整數i
,寫入“ *p2
”將取消引用p2
並給出位於地址&i
處的int
。
因此,代碼“ int *p2 = &i;
”使它看起來像將int
設置為等於內存地址一樣。
確實,代碼
int i = 1;
int *p2;
*p2 = &i
這是錯誤的,因為在最后一行, *p2
是int
因為它已被p2
取消引用,而&i
是指針。
為什么 int *p2 = &i;
與上面有缺陷的代碼的最后一行沒有做相同的事情:
代碼int *p2 = &i;
與上面的3行代碼不同,因為它是一個聲明。 當您聲明一個指針變量時,您將類型(例如int
, long
, char
等)和變量名(與普通變量一樣)放置在這兩個部分之間(還請在其中加上星號*
(請參閱@上面關於此的許多間距選項的chqrlie答案-Takehome的最佳實踐是將*
堅持到變量名上)。 在聲明中, *
不會取消引用指針。 相反,它告訴編譯器變量myPointer
將是指向內存的指針,該內存保存已聲明類型的數據(之前的int
, long
, char
等)。 因此,在代碼“ int *p2 = &i;
”的位中,在同時聲明和實例化指針的情況下, *
不在左側顯示int
。 對於聲明,將*
放在變量名旁邊比較安全(如@chqrlie指出),但這不會解包指針,即使在聲明中實例化了指針也是如此。 對於聲明,應將*
視為附加在類型上(而不是變量名,原因很可能是變量名)。 我喜歡用指針名稱旁邊的*
來聲明指針,但是只要了解一下,當在聲明中實例化指針時,對於新學習者來說,想象這行的更清晰的方法就是int* p2 = &1
:
int*
(類型為pionter-to-int) p2
(指針的名稱) = &i
(等於給出整數i
的地址的指針) ;
感謝所有回答和評論的人,也祝所有可能來這里弄清楚指針的人好運。
指針是內存地址的抽象 ,帶有一些關聯的類型語義。
p2
類型為int *
或“ int
指針”。 它存儲整數對象的位置(在這種情況下,是對象i
的位置)。 表達式 *p2
的類型為int
:
p2 == &i; // both expressions have type int * and evaluate to an address value
*p2 == i; // both expressions have type int and evaluate to an integer value
指針與存儲地址值所需的大小一樣大,但是該地址值是針對給定平台表示的(無論是單個整數值,還是代表頁碼和偏移量的一對值,或者某種其他格式) 。 請注意,不同的指針類型可能具有不同的大小,盡管在現代桌面體系結構上它們都具有相同的大小(32或64位)。
指針的類型對於指針算術很重要。 給定一個指針p
,表達式p + 1
產生指向類型的下一個對象的地址。 如果指向的類型為1字節寬(例如char
),並且其當前地址為0x8000,則p + 1
產生下一個字節的地址,即0x8001。 如果類型為4個字節寬(例如long
),並且其當前地址為0x8000,則p + 1
產生下一個第四個字節的地址,即0x8004。
指針是它自己的類型。 如果使用其他語法,則可以這樣編寫:
Pointer x = new Pointer(int, address);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.