c語言中,為什麼在64位系統中long跟指標的大小是8,而

時間 2021-08-30 09:32:14

1樓:

64位系統,這個位數指的是cpu 裡面的通用暫存器的資料寬度為64位,也就是說一個地址佔二進位制位數是64,所以sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8

32位系統,同理,他的一個地址佔32位二進位制空間,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4

其實明白了兩個系統的定址原理就能明白,大體就是這個原因。

地址跟系統有關,但是基本資料型別佔的大小是由c語言本身決定。

2樓:匿名使用者

當然是不同平臺的c語言編譯器導致不同。

3樓:

如果你學習過彙編,你就能夠理解了。

在32位的系統中,運算器一次最多可以處理32位的資料,暫存器的最大寬度也是32位的。然後, c語言中對資料寬度的規定是指標變數、long型變數的寬度推薦是處理器一次能夠處理的最大寬度,所以就是32位,也就是4個位元組。

同理,在64位系統中,運算器、暫存器等一次處理的寬度是64位,也就是8個位元組,所以指標變數、long型變數等也就都是8個位元組了。

4樓:匿名使用者

64位win7,vs2010控制檯程式中

sizeof(long*) 是4而不是8。

應該和編譯器的定義有關。

5樓:匿名使用者

根據地址資料匯流排來定的

c語言中,指標為什麼不能指向不同型別的變數?

6樓:萍水e相逢

資料會混亂

如果自己知道怎麼回事,可以試著強制轉換

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

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

8樓:哇哎西西

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

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

9樓:舟

指標即為地址,它是一個

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

10樓:匿名使用者

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

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

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

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

11樓:千鋒教育

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

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

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

12樓:天雲一號

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

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

char a = "abcdefgh";

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

13樓:匿名使用者

指標佔用多少位元組,取決於所使用的編譯器版本,編譯器有16位、32位、64位之分,16位和32位編譯器可以執行在32位作業系統上,而64位作業系統可以執行這三種編譯器。

16位編譯器下,一個指標佔用2位元組;32位編譯器下,一個指標佔用4位元組;64位下,一個指標佔用8位元組。

當前(2023年1月)國內大部分電腦已經使用上了64位windows作業系統,但visual studio等程式設計軟體預設使用的編譯器是32位編譯器,因此最常見的情況是一個指標佔用 4 個byte。

蘋果的macos系統自帶clang編譯器,預設是64位,因此通常在蘋果電腦上編寫c語言程式時,指標佔用8個位元組。

14樓:鬼火狼煙

指標長度和執行程式的作業系統是有關係的,lz的老師說是2在現在來說的確是錯誤的,一般編譯器會把指標的長度定義為系統的字長(這點lz應該堅持自己的想法呵呵),指標的長度在16位os比如dos上的確是2個位元組,但是在32位的windows上,就是4位,很多老版本的c教材都是2個位元組,這個不能籠統的說是錯了,而是有它的歷史原因在裡面.所以lz的老師應該多看看新版本的書籍了,教育應該和科技的發展接軌才可以呵呵~

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

15樓:匿名使用者

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

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

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

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

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

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

16樓:迷迷惘惘的娃兒

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

C語言中位操作 3》31值為什麼是

右移操作時,連同符號位同時移動,且符號位是1 負數 時,補1,符號位是0 正數 時補0。char a 3 3 11111101 2事實上,右移2位後,該數為11111111,次數已經是 1了。 c語言中,假設你的機器字長一個位元組是32位,那麼你注意 3在計算機補碼中表示 1111 1111 111...

c 語言中n的意思是什麼,在c 語言中while(n 的意義是什麼?怎麼用?

n 不是換行,換行是 n,轉義字元是以 開頭,這個是 開頭的,如果樓主是 cout n 這種書寫,在vc 6.0中將會導致編譯器執行運算子過載的操作,經過無數的庫函式呼叫後,最終得到一個12142的數值,若樓主採用cout n 21.1111這種格式的寫法,由於沒有換行操作,將會在21前面加上一個1...

在c語言中怎樣設定斷點,c語言中什麼叫做單步除錯,步驟是什麼???

我要鬥爭到死 你用的哪種開發工具,tc 還是 vc 還是 borland c 還是gcc,還是vc net?每種工具都有自己設定斷點的方法,一般載選單項或工具欄裡都有設定。如果用linux的gcc 需要用gdb調式工具設定斷點。 vc中快捷鍵f9,滑鼠在哪一行斷點就設在哪 c語言中什麼叫做單步除錯,...