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

2021-03-07 05:51:10 字數 6076 閱讀 3489

1樓:匿名使用者

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

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

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

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

2樓:文化廚子

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

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

3樓:鍵盤雀躍

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

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

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

ffffffffff600000-ffffffffff601000

4樓:匿名使用者

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

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

5樓:匿名使用者

指標大小是

根據處理器而定的。

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

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

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

6樓:root棧

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

7樓:90後小白

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

8樓:匿名使用者

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

9樓:匿名使用者

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

c語言裡指標指不論指向任何變數它自身都只佔4個位元組為什麼?

10樓:匿名使用者

指標存放復的是記憶體地制址.

記憶體地址多少位,是由編譯器決定的.

編譯器如果是32位的,那麼地址就是4位元組.

如果是64位的,那麼就是八位元組.

不會因為存放資料型別的不同而變化.

就像家裡的門牌號, 不管家裡住多少人, 是別墅還是平房, 門牌號都是街道統一規定的.

11樓:迷迷惘惘的娃兒

指標存放的是一個記憶體地址,32位系統中一個地址的長度為32位,所以一個指標的大小也是32位,即4位元組

12樓:匿名使用者

對啊bai

指標是存放地址用滴。du。

打個比方,zhi

你要寄一封信,dao得寫郵政編碼吧。。內

13樓:匿名使用者

指標自己也是一個變數 只不過這個變數代表著一塊記憶體地址。

因為32位系統地址寬度為4個位元組。為了表示地址,指標長度就是32位

14樓:匿名使用者

這是編譯器決定的,

copy

和int,char,long佔幾個位元組一樣。

在dos系統的tc編譯器下就有2位元組的指標,在32位windows作業系統(xp,win7 32位)vc編譯器下(最常用的環境)指標就是4個位元組;

在64位windows(win7 64)的 vc(x64設定)下有8個位元組的指標

15樓:hello嗨

因為儲存地址只要四個位元組,地址就是個數字,所以四個位元組就可以

16樓:veket的小號

pc主機板地址匯流排32位 32位幾個位元組

17樓:麥湉繩瑋琪

一個指標變數在記憶體中佔兩個位元組(**all模式編譯)

一個指標變數在記憶體中佔四個位元組(32位機器上)

一般都是32位機器的,所以四個位元組咯。

c語言的指標變數在記憶體中佔多少位元組?

18樓:匿名使用者

一個指標變數在記憶體中佔兩個位元組(**all模式編譯)

一個指標變數在記憶體中佔四個位元組(32位機器上)

一般都是32位機器的,所以四個位元組咯。

19樓:匿名使用者

4byte,32bit

c語言的指標變數在記憶體中佔多少位元組?

20樓:桐碧蓉龔罡

一個指標變數在記憶體中佔兩個位元組(**all模式編譯)

一個指標變數在記憶體中佔四個位元組(32位機器上)

一般都是32位機器的,所以四個位元組咯。

在c語言中指標變數佔2個還是4個位元組????老師說2個。。。。我覺得是4個。。

21樓:空雪夢見

ms-dos下是2個,windows下有

抄2個的有bai4個的有8個的,看是

du16位程式

還是32位程式還是64位程式。

說2個的那是很早很早以前的教材,然後這幫選教材的人又不跟進時代……如果你用的是turbo c,那麼2個。用的vc,大部分時候是4個,編譯的時候設定成64位那麼就是8個

22樓:示申僉

現在都是32位和64位系統了,所以要麼是4個,要麼就是8個,所以你可以寫一版段c程式來測試,

看權sizeof(char *)值到底是多少就知道了。

sizeof(int *)==sizeof(double *)==sizeof(char *)

23樓:匿名使用者

和具bai體的編譯器選項du

有關係,如果編譯

zhi器編譯時選擇的dao是一款16位的cpu那麼指標就是專2個字屬節,32位的cpu就是4個位元組,64位則是8個位元組。特別的,大部分編譯器關於cpu的選項包含三個部分,cpu的型別-cpu的指令型別-作業系統型別,3者共同決定了目標cpu是多少位

24樓:匿名使用者

測試不就得了,但是據我所知,好像不同的系統和不同的軟體會產生差異的說!!!

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

25樓: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*()

26樓:哇哎西西

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

比如以前是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 個位元組的長度。

C語言中,指標變數該如何使用呢,C語言中指標和指標變數的區別是什麼

int integer 0 為求來 地址運算子,指標用來儲存 源一些變數的bai地址 可以這樣訪du問 pinteger 得到 pinteger這個整形指標裡面的值 zhi0 建議看dao 相關的書,難懂的東西才有意義 所謂指標其實就是用來儲存地址的 就這樣想就好了 比如 int a,p p a 就...

在C語言中指標變數佔還是位元組老師說我覺得是

ms dos下是2個,windows下有 抄2個的有bai4個的有8個的,看是 du16位程式 還是32位程式還是64位程式。說2個的那是很早很早以前的教材,然後這幫選教材的人又不跟進時代 如果你用的是turbo c,那麼2個。用的vc,大部分時候是4個,編譯的時候設定成64位那麼就是8個 現在都是...

C語言中指標與陣列有什麼關係,C語言中,指標和陣列的區別和聯絡

c語言中陣列和引數可以通用,陣列有一個基址,c中用指標指向它,計算陣列元素地址的時候,是基址 元素位元組數 元素序號 1 陣列名bai代表陣列在記憶體du中的首地址。指標可zhi以儲存一個地址dao,也即指向某地回址。在c中,答 對於某地址的訪問有兩種方式 1.直接訪問,如用變數名進行賦值等 2.間...