C 語言中不同型別指標的大小是否完全相同,為什麼?

時間 2021-05-11 22:44:56

1樓:辰落火輝裂開了

ISO/IEC 9899:202x N2596 Working draft

§ 6.3.2.3

A pointer tovoidmay be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer tovoidand back again; the result shall compare equal to the original pointer.

也就是,

任何指標都可以轉換為任何指標,任何指標也都可以翻過來轉換成原來的指標指標,結果應該和原指標一致。

為什麼

指標就是存位址的,你位址有多長就存多長(

比如32位作業系統,位址就是32位,指標也就是4個位元組(32位)。

再比如64位作業系統,位址就是64位,指標也就是8個位元組(64位)。

2樓:小莊讀書

先說答案:是!

因為指標本身存放的是記憶體位址,而記憶體位址的長度是固定的(32位或64位),所以要存放固定長度的位址,小了不夠、多了浪費~~

3樓:大千小熊

你是不是想問,為什麼int型別的指標和char型別的指標大小占用一樣?

如果您問的是這個問題,請往下面看:

我們都知道,指標裡面存放的是資料的位址,那麼char型別指標,int型別指標幹什麼去區別這麼仔細呢?

實際上,區別這麼仔細的原因是:為了便於計算。

您想想,現在有乙個char型的數值,如果使用指標表示它的第乙個位置,現在指標想要指向下乙個位置,那麼指標要跳躍幾個格仔才能真確的指向下乙個位置呢?我們知道,乙個char型的資料是佔乙個位元組,而計算機中乙個記憶體單元(你可以想象成酒店的門牌)就是乙個位元組。所以指標跳乙個記憶體單元,也就是乙個小格仔就可以了。

也就是從酒店201房間去202房間就可以了。

現在,您是酒店的老闆。

總共有256個房間,房間的門牌編號是0到256。

現在你需要乙個指標,要求這個指標記錄門牌號碼。

如果這個指針對您說,它只能記錄1,2,3,4這些門牌號碼,你會滿意嗎?

顯然不會。因為,這個指標是乙個2位的指標,它只能表示00,01,10,11。

想要將256個數字全部表示要開多大的指標???

2^8=256

所找乙個8位的指標當然是乙個好的選擇,因為現在它終於有能力記錄所有的門牌號碼了。

一台8位的計算機。如果插滿記憶體條,指標到底開多大才能完全表示位址。答案是8位。

所以在256MB的記憶體上面有乙個指標佔據了8bit=1B的大小。

按照這個說法,在8位計算機上面,無論是什麼型別,指標大小都應該大於等於1B才能不會出錯。

那麼推廣,32位的機器,當然要開乙個指標占用32bit=4B才能儲存所有的位址都能記錄。

4樓:王聰

指標其實是乙個整數

計算機中的記憶體都是編址的,每個位址都有乙個符號,就像家庭位址或者IP位址一樣。指標,是乙個無符號整數(unsigned int,因不致歧義,下簡稱「整數」),它是乙個以當前系統定址範圍為取值範圍的整數。宣告指標和宣告乙個無符號整數實質上並無區別。

32位系統的定址能力(位址空間)是4GB二進位制表示長度為32位元,也就是4B。同理,64位系統取值範圍為int型別長度為8B。

具體的解釋參考

5樓:王可柱

同一平台上資料指標是一樣的,資料指標和函式指標不一定一樣。實際應用中基本不會遇到資料指標和函式指標大小不一的情況,遇上了就說明你太偏門了。遇到需要儲存函式指標的定義乙個

typedef int (*func_ptr_t)();

func_ptr_t foo = (func_ptr_t)bar;

可能比 uintptr_t 更具有可移植性。

6樓:惠寶她爹

同一平台下指標大小都相同,不同型別的指標步長不同;比如PC x86上是4位元組,x64上是8位元組, 不過這個結論不包括void*

7樓:鄧鋆

古老的8086/80286平台下,指標分near和far兩種(學過8086彙編的應該可以比較容易理解),其大小不一樣,但跟型別無關,僅和指標本身的near/far有關。

在目前所需要考慮的主流平台如:x86、x64、IA64、arm等平台,基本不再需要考慮指標本身的大小差異了。另外現代的標準還規定編譯器應該定義如下型別:

std::intptr_t 和void*同大小的有符號整數

std::uintptr_t 和void*同大小的無符號整數

這兩個型別通常用於將指標型別轉換成整數型別用於運算、儲存或傳遞的場合。

另外,C++標準規定了用於表示資料大小的型別:std::size_t,以及表示指標差值的型別std::ptrdiff_t 這兩個型別通常用於需要將指標/大小進行數值運算的場合。

在目前的主流平台與編譯器中,它們恰好與void*同大小,但為了更好的可移植性,如果要將乙個指標強制轉換成整數型別,應該用std::uintptr_t或std::intptr_t

不同型別的空指標相同嗎?

Kent Zhang double NULL int NULL 式子為真。int p int NULL 不會報警告。int p double NULL 可能會報警告。 指標本身並沒有型別,指標指向的物件才有型別。int指標 指向乙個int物件的指標。絕大多數指標都是一樣的,就是乙個目標位寬的大小,4...

c語言陣列可以儲存不同型別資料嗎?

乙隻樹 不可以,陣列的元素必須時同一種型別,因為記憶體的分配是按照 單個元素所佔記憶體 元素個數分配的。當然,你的陣列元素可以是不同型別成員組成的乙個結構體型別。 在c 裡可以做到,比如std variantauto printer auto value else ifconstexpr std i...

在 C 語言中指標的歷史是怎樣的?

Crazyjin 型別 變數和變數的值本來就是三個概念 一直都是三個概念。int是型別,int a 申明了乙個int型別的變數a。pointer是型別,pointer variable是pointer型別的變數。只不過這裡pointer和pointer variable沒有指明具體型別。這裡舉個具體...