C語言中指標佔用多少位元組,C語言中乙個指標佔用多少位元組

2021-03-04 06:00:26 字數 6428 閱讀 1164

1樓:匿名使用者

指標即為位址,指標幾個位元組跟語言無關,而是跟系統的定址能力有關,譬如以前是16為位址,指標即為2個位元組,現在一般是32位系統,所以是4個位元組,以後64位,則就為8個位元組。

2樓:蒸蒸zh日上

借lz的問題,請教大家乙個問題吧; 指標佔用的位元組數和指標的型別有關係嗎?謝謝哦~

c語言中,指標變數為何只佔4位元組?

3樓:匿名使用者

首先要明白的是,指標變數是用來存位址的變數,也就是說,這個變數裡面存的內容是位址。

那麼開始解釋,cpu與記憶體進行直接互動時,cpu要獲得記憶體中的資料,就要知道這個資料在記憶體中所在的位址,那麼cpu就要在記憶體中定址。記憶體中的位址的基本單位為位元組,即乙個位元組乙個位址,32位cpu有32根位址匯流排,記憶體大小為2^32位元組,即4gb,也就是說,這4gb的記憶體中,每一位元組的記憶體空間都有自己的乙個在記憶體中的位址。

重點來了,指標變數是用來存位址的,32位cpu中,要想指標能夠儲存這2^32次個位址,需要多大的空間呢?很明顯,4個位元組,即32位,32位的變數能表示的資料個數剛好為2^32個,能能夠把記憶體中的所有位址表示完全。

所以32位中,指標變數需要4位元組,以此內推其他位數cpu。

4樓:文化廚子

在c語言中,一般認為記憶體是乙個大的位元組

陣列,基本單位是位元組,每乙個位元組包含乙個位址,有多少個位址,是有cpu的位址匯流排位數決定的,所有的位址一般稱作位址空間,比如32位的cpu,位址匯流排的位數是32位,它可描述的位址空間為0x0000 0000 0000 0000 ~ 2^32 - 1,正是因為此,所以在32位的系統上,一般指標佔4個位元組,如果是64位系統,它可描述的位址空間為0~2^64-1,如果是64位的編譯器,指標佔8個位元組。

5樓:鍵盤雀躍

記憶體位址 0x11223344h = 高位址位 + 低位址位

你說的a000h是位址中的高位址位或低位址位cpu決定記憶體的編址,如32位cpu有32條位址匯流排,對應的位址格式為 10 01 .... 01 01 = 32bit =4byte

64位 -> 01 01 10 10 ....01 = 64bit =8byte,而指標大小依舊是4byte.

ffffffffff600000-ffffffffff601000

6樓:匿名使用者

指標儲存的是計算機的記憶體位址,在同一臺機器同乙個編譯器上,所有指標的大小都是固定的,一般都是4位元組。位址的大小跟資料型別沒有關係。

你說的a000h只是16位,是的,這個數可以是16位,但是如果是位址,那麼你是決定不了,只與機器和編譯器有關係。

7樓:匿名使用者

指標大小是

根據處理器而定的。

比如32位系統cpu一次處理32位也就是4個位元組,所以指標也就是4個位元組,最大的記憶體訪問也就為2^32=4g。

如果在64位系統中,指標就是8個位元組;但是一些編譯器的限定,在64位中也只有4個位元組。

另外在一些微控制器上指標就可能是1~3個位元組。

8樓:root棧

指標, 本質是指向記憶體的位址空間。32位的系統,記憶體位址空間從0x00000000到0xffffffff,4個位元組完全夠指向這些位址範圍了。同理, 16位系統,指標佔用2個位元組, 64位系統,指標佔用8個位元組

9樓:90後小白

指標指向第乙個位元組的位址。乙個位元組佔位,所以不管指標指向double還是int還是結構體型別都只佔4個位元組

10樓:匿名使用者

目前我們用的都是32位系統,也就是用4個位元組表示記憶體位址,所以指標佔用4個位元組

11樓:匿名使用者

指標只存記憶體位址,而記憶體位址是有固定大小的。所以,指標沒必要很大,夠用就行。所以官方定位4

c語言中,乙個指標佔用的空間是多大?和指標型別有關係嗎?

12樓:

指標和其指向的資料型別有關係,你可以用sizeof()來做測試:

printf("the size of char is %d\n",sizeof(int*));

printf("the size of char is %d\n",sizeof(char*));

另外,指向結構體的指標就要看具體情況了,c語言還有所謂的「對齊機制」,就是結構體裡的單元,所分配的空間實際上要參照結構體裡「體積」最大的那個單元。就是說,比如乙個char和乙個int,char要向int看齊,乙個char和乙個double,char要向double看齊。關鍵就在於湊整數,湊成最大變數大小的倍數。

當然,如果結構體裡只有char型的變數或是陣列,就不存在一定要湊數的問題了。

13樓:匿名使用者

2位元組,宣告為far時為4位元組

在c語言中乙個指標佔用多少位元組。

14樓:blackpink_羅捷

乙個指標變數在記憶體中佔兩個位元組(**all模式編譯),乙個指標變數在記憶體中佔四個位元組(32位機器上),一般都是32位機器的,所以四個位元組咯。

指標即為位址,指標幾個位元組跟語言無關,而是跟系統的定址能力有關。

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容:指標的型別、指標所指向的型別、指標的值或者叫指標所指向的記憶體區、指標本身所佔據的記憶體區。

擴充套件資料

1、指標的型別

從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別:

(1)int*ptr;//指標的型別是int*

(2)char*ptr;//指標的型別是char*

(3)int**ptr;//指標的型別是int**

(4)int(*ptr);//指標的型別是int(*)

(5)int*(*ptr);//指標的型別是int*(*)

2、指標所指向的型別

當你通過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區里的內容當做什麼來看待。

從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。例如:

(1)int*ptr; //指標所指向的型別是int

(2)char*ptr; //指標所指向的的型別是char

(3)int**ptr; //指標所指向的的型別是int*

(4)int(*ptr); //指標所指向的的型別是int()

(5)int*(*ptr); //指標所指向的的型別是int*()

15樓:哇哎西西

指標即為位址,指標幾個位元組跟語言無關,而是跟系統的定址能力有關。

比如以前是16位系統,指標即為2個位元組,現在一般是32位系統,所以是4個位元組。

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容:指標的型別、指標所指向的型別、指標的值或者叫指標所指向的記憶體區、指標本身所佔據的記憶體區。

擴充套件資料:

1、指標的型別

從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別:

(1)int*ptr;//指標的型別是int*

(2)char*ptr;//指標的型別是char*

(3)int**ptr;//指標的型別是int**

(4)int(*ptr)[3];//指標的型別是int(*)[3]

(5)int*(*ptr)[4];//指標的型別是int*(*)[4]

2、指標所指向的型別

當你通過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區里的內容當做什麼來看待。

從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。例如:

(1)int*ptr; //指標所指向的型別是int

(2)char*ptr; //指標所指向的的型別是char

(3)int**ptr; //指標所指向的的型別是int*

(4)int(*ptr)[3]; //指標所指向的的型別是int()[3]

(5)int*(*ptr)[4]; //指標所指向的的型別是int*()[4]

3、指標的值或者叫指標所指向的記憶體區或位址

指標的值是指標本身儲存的數值,這個值將被編譯器當作乙個位址,而不是乙個一般的數值。在32 位程式裡,所有型別的指標的值都是乙個32 位整數,因為32 位程式裡記憶體位址全都是32 位長。

指標所指向的記憶體區就是從指標的值所代表的那個記憶體位址開始,長度為sizeof(指標所指向的型別)的一片記憶體區。以後,我們說乙個指標的值是xx,就相當於說該指標指向了以xx 為首位址的一片記憶體區域。

我們說乙個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首位址。指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。在例一中,指標所指向的型別已經有了,但由於指標還未初始化,所以它所指向的記憶體區是不存在的,或者說是無意義的。

4、指標本身所佔據的記憶體區

在32 位平台裡,指標本身佔據了4 個位元組的長度。

16樓:舟

指標即為位址,它是乙個

無符號整數(unsigned int),

它是乙個以當前系統定址範圍為取值範圍的整數。

指標幾個位元組跟語言無關,而是跟系統的定址能力有關。

譬如以前是16為位址,指標即為2個位元組,

現在一般是32位系統,所以是4個位元組,

以後64位,則就為8個位元組。

擴充套件資料:1、在64位機器中:

char型別佔1個位元組,short型別佔2個位元組int型別佔4個位元組,long型別佔4個位元組unsigned int型別佔4個位元組,float型別佔4個位元組double型別佔8個位元組。long double型別佔12個位元組2、記憶體分配表

計算機中的記憶體都是編址的,就像你家的位址一樣。在程式編譯或者執行的時候,系統(可以不關心具體是什麼,可能是編譯器,也可能是作業系統)開闢了一張表。每遇到一次宣告語句(包括函式的傳入引數的宣告)都會開闢乙個記憶體空間,並在表中增加一行紀錄。

記載著一些對應關係。

3、c語言

c語言是一門通用計算機程式語言,廣泛應用於底層開發。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。

17樓:一碗湯

指標其實就是位址, 與它所指的基型別無關, 更與c語言無關, 只與機器有關. 如果機器是16位定址的, 那指標就是16位的, 如果是32位定址的, 指標也是32位的.

較特殊的是老式的x86, 它是16位的機器, 但採用了分段定址, 所以指標是兩個16位合起來的(但與真正的32位又不同)。

擴充套件資料:

相關單位

b與bit

資料儲存是以「位元組」(byte)為單位,資料傳輸大多是以「位」(bit,又名「位元」)為單位,乙個位就代表乙個0或1(即二進位制),每8個位(bit,簡寫為b)組成乙個位元組(byte,簡寫為b),是最小一級的資訊單位。

b與ib

1kib(kibibyte)=1024byte

1kb(kilobyte)=1000byte

1mib(mebibyte)=1048576byte

1mb(megabyte)=1000000byte

硬碟生產商是以gb(十進位制,即10的3次方=1000,如1mb=1000kb)計算的,而電腦(作業系統)是以gib(2進製,即2的10次方, 如1mib=1024kib)計算的。

但是國內使用者一般理解為1mib=1m=1024 kb, 所以為了便於中文化的理解,翻譯mib為mb也是可以的。

同樣根據硬碟廠商與使用者對於1mb大小的不同理解,所以好多160g的硬碟實際容量按計算機實際的1mib=1024kb算都不到160g,這也可以解釋為什麼新買的硬碟「缺斤短兩」並沒有它所標示的那麼大。

資料型別

byte資料型別(位元組型)用乙個位元組(byte)儲存,可區別256個數字,取值範圍:0到255。 byte是從0-255的無符號型別,所以不能表示負數。具體參照資料型別。

語言字元

效果等同於 unsigned char型

typedef unsigned char byte

定義一種新型別byte,它其實就是unsigned char

在vc++中,byte型資料的定義包含在windows.h標頭檔案中,呼叫byte需要新增**#include

而在java中,byte是乙個關鍵字

表示宣告了乙個整形常量在內容中佔用乙個位元組

取值範圍是-128~127

C語言中的空指標,C語言中的空指標是什麼意思?

int p 47 這個用法是不正確的 這個語句等於下邊的 int p p 47 你直接將指標p的值賦值為47是很危險的 應為如果記憶體中位址為47的地方剛好是某個系統程式或關鍵模組佔據的話你進行下面 p 20 的賦值行為 有可能導致系統直接崩潰哦 是的,不過這很危險。而且cpu的32位保護機制也未必...

c語言指標問題,求解答,C語言中的指標問題,求解答

1,是取值運算子,因為你要判斷tt的值的情況,所以要用 2,tt 相當於 tt tt 1 這個是指標向後移動,不需要取值,謝謝,望採納 你的tt是指標吧。tt指向的是 位址 比如位址值為 10ff 1000 tt是取這個位址中儲存的資料,而tt 意思把tt指向的位址值 1,即tt現在指向了 10ff...

c語言關於指標的求解,C語言中關於指標的指標問題?

int x 10 p1 a x 3 x 3 3 陣列從0開始,3其實是第四個 b p1 x 3,p1 先執行p1 x 3,也就是指向x 3 因為p1定義成指標。p1 這時候先執行再加,這表示式仍然是3 c p1 x 2,p1 p x 2 x陣列的位址加2,也就是指向x 2 x 2,這時候p 同時也是...