指標指向不同型別資料時,指標變數佔用多大空間

時間 2021-08-16 09:00:06

1樓:匿名使用者

在c中, 指標只有3種:

指向簡單變數的, 指向結構體變數的, 指向函式的.

他們的大小和指向的型別無關, 基本都是一樣的, 等於地址寬度.

在16位的地址的系統裡, 用 段:偏移 來表示一個地址,當只用偏移的時候(段內)稱為near指標, 當段偏移都用的時候(跨段), 稱為far指標,

far指標佔用空間大於near指標.

但是在32位系統中, 指標大小是統一的.

在c++中,

指向簡單變數, 簡單結構體物件, 和簡單函式的指標是和c一樣的.

但是, 對於有多繼承的物件, 指標可能需要記錄一些額外的資訊, 可能會更大一些.

你可以用 sizeof(xx)來測試各種指標的大小,需要注意的是, 不同的編譯器結果可能不一樣.

最後的結果是:

一般而言, 指標大小是固定的, 並不因為其指向的物件型別而改變.

然而並不總是這樣.

2樓:匿名使用者

指標變數所佔空間大小和該指標變數指向的資料型別沒有任何直接關係,同一編譯器下,同一編譯選項下所有型別的指標變數大小都是一樣的,指標變數的大小是編譯器所對應的系統環境所決定的,或者說是由編譯器決定的

3樓:剛果的冬天

指標的長度大小與儲存空間大小有關,與所指向的資料型別無關

指標的資料型別為什麼要跟所指向的資料的型別一致,不是說所有的指標變數佔用的記憶體大小是相同的嗎??

4樓:匿名使用者

指標變數所bai需要的儲存

空間的確du是相同的zhi

。它都需要最高字長dao的儲存空間。

但在指標指向內不同型別的容

資料型別空間時,指標操作是不同的,見下示例**:

unsigned char * ptrchar;

unsigned int  * ptrint;

ptrchar=(unsigned char *)0x0000;

ptrint=(unsigned int *)0x0000;

ptrchar++;

ptrint++;

最後兩個指標++操作,看**都是用的加加操作符,但實際上,指向無符號char型資料的指標,在加加操作後,ptrchar中的值是0x0001,因為每個無符號char只佔用一個位元組,而ptrint在加加操作後,其值是0x0004,因為每個整型佔用4個位元組。

5樓:安城百合子

這是c語言的語法要求,因為不同型別的指標,在作+-運算時,它的步長是不一樣的。

6樓:

所有的指標變數佔用的記憶體大小是相同的,這個記憶體中儲存的不是資料的值,而是指標的

回值,指標的值答是一個記憶體地址,也就是指標指向資料的首地址,根據這個地址只能得到指標指向資料的開始位置,並不知道這是什麼型別的資料,所以指標的型別就決定了資料的型別

7樓:匿名使用者

你是什麼指標?很多語言都有指標的。

指標儲存的是資料的首地址,它指向和它同一型別的資料。跟佔用多少空間沒關係。用int型指向int型,double指向double型,等等。如果不匹配會發生錯誤。

8樓:匿名使用者

是的,它只是要知道你指向的資料是什麼型別而已。

9樓:匿名使用者

所有指標 都是佔來用4個位元組這個是自沒錯

但是為什麼bai不能用du呢?給你舉個例子。

int a = 0x00000fff;

char *p = &a;

printf("%d\n", *p);

結果是255。也zhi

就是說 每一dao個型別的指標所取的bit長度不一樣!char型別佔用8bit, int 32bit,short 16bit。

上邊這個例子不好

由於 是有符號的 所以255 打出來是-1改一下int a = 0x00000f0f;

這樣的話就是15了

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

10樓:blackpink_羅捷

一個指標變數在記憶體中佔兩個位元組(small模式編譯),一個指標變數在記憶體中佔四個位元組(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*()

11樓:哇哎西西

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

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

12樓:舟

指標即為地址,它是一個

無符號整數(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語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。

13樓:匿名使用者

16位處理器可以一次性處理2個位元組的資料量,指標即為2個位元組;

32位處理器可以一次性處理4個位元組的資料量,所以是4個位元組;

64位處理器可以一次性處理8個位元組的資料量,所以是8個位元組。

指標是一個用來指示一個記憶體地址的計算機語言的變數或**處理器(cpu)中暫存器(register)。在使用一個指標時,一個程式既可以直接使用這個指標所儲存的記憶體地址,又可以使用這個地址裡儲存的函式的值。且一個位元組=8位。

14樓:千鋒教育

假設q指向int型別變數 (佔4個位元組)

假設r指向double型別變數 (佔8個位元組)sizeof(資料型別) 此運算子功能:返回值就是該資料型別所佔的位元組數。

sizeof(變數名) 此運算子功能:返回值就是該變數所佔的位元組數# include int main(void)執行結果:總結:任何型別的指標變數都是佔用4個位元組。

15樓:天雲一號

c語言規定一個指標佔4個位元組。

檢視指標所佔位元組數可以用sizeof( )函式進行測試。如:

char a = "abcdefgh";

char *p = a;  // 定義一個指標變數,指向字元陣列aprintf("%d\n", sizeof(p));  // 輸出指標所佔的位元組數,輸出4

能否建立void指標指向任何型別的變數

使用型別轉換的時,以void 為中介型別是個次等選項,能不用就別用。因為在強制型別轉換中,轉換到void 型別的結果會將帶型別的指標 typed pointer 的型別資訊悉數抹除,在典型的情況下,只要以void 為型別轉換的中介型別,則必須牢記這個指標的原始型別資訊,並 適時的在通過一次強制的型別...

C 指標指向型別轉換,C 指標 型別轉換問題,

long型別佔四個位元組,char佔一個,強制轉換後lp的每個元素就是對應從arr開始的四個位元組,即lp所指向的物件就是arr,arr 1,arr 2,arr 3這四個位元組所指向物件,低位元組在前,高位元組在後,下面是個例子 char arr 20 abcdefghijklmnopqrs lon...

普通的指標變數可以指向二維陣列嗎

麥香甜甜圈 當然可以。因為二維陣列在記憶體中也是按照一維方式存放的 記憶體單元是一維的 下面有個參考程式你可以試試。include void main int p a printf d n p 結果輸出1,將 p改寫成 p 1 則輸出2,改寫成 p 7 則輸出8,可見 p可以指向二維陣列中的任何一個...