簡體   English   中英

給定一個字節內存地址不是int類型,int類型的C指針如何保存一個內存地址?

[英]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

這是錯誤的,因為在最后一行, *p2int因為它已被p2取消引用,而&i是指針。

為什么 int *p2 = &i; 與上面有缺陷的代碼的最后一行沒有做相同的事情:

代碼int *p2 = &i; 與上面的3行代碼不同,因為它是一個聲明。 當您聲明一個指針變量時,您將類型(例如intlongchar等)和變量名(與普通變量一樣)放置在這兩個部分之間(還請在其中加上星號* (請參閱@上面關於此的許多間距選項的chqrlie答案-Takehome的最佳實踐是將*堅持到變量名上)。 在聲明中, *不會取消引用指針。 相反,它告訴編譯器變量myPointer將是指向內存的指針,該內存保存已聲明類型的數據(之前的intlongchar等)。 因此,在代碼“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM