c語言指針大小
⑴ c語言 如何輸出指針所指向空間的大小
C語言無法輸出指針所指向的空間的大小!
一般,我們獲取一個變數所佔內存空間的方法為:sizeof(變數名或類型名),如:
int a;
int aa[10];
int *p=aa;
printf("sizeof(int)=%d\n", sizeof(int) ); //現在的機器一般為32位或64位機,int類型佔四個位元組,所以輸出4
printf("sizeof( a )=%d\n", sizeof(a) ); //輸出4
printf("sizeof( aa )=%d\n", sizeof(aa) ); //輸出4*10=40
printf("sizeof(p)=%d\n", sizeof(p) );//輸出4 ?見下面說明
printf("sizeof(int *)=%d\n", sizeof(int *) );//輸出4 ?見下面說明指針變數定義:用來存儲內存地址的變數。指針變數中存儲的是內存地址數據(一個整型數),而不是真正的數據,真正的數據是在地址中存放的。所以,指針變數實際上就是個整型變數,用sizeof命令去獲取任意類型的指針變數都會得到4。
指針變數存儲的是一個存儲空間的首地址,究竟這個空間有多大,可以存儲多少個數據,這是分配空間時所決定的。單獨看一個地址值,是看不出其空間大小的。如:
int
a;
int
aa[10];
int
*p
;
//定義一個指針變數
p=aa
;
//指向數組aa,aa的數據空間是40位元組,10個整數
p=&a;
//指向一個整型變數,它的存儲空間是4位元組,一個整數
⑵ C語言指針變數大小的問題
對於這個你只要記住一句秘訣就好,指針的大小僅僅取決指針本身的大小,不取決於指針指向的大小。 還有就是還有一個虛擬內存和物理地址的關系,有MMU映射,8086里有硬體完成一個地址偏移的過程,物理地址 = 基址*16 + 變址。
⑶ C語言中指針的長度!
記住32位下的指針 都是4個位元組可以簡單的這么理解:一個基本的數據類型(包括結構體等自定義類型)加上「*」號就構成了一個指針類型的模子。這個模子的大小是一定的,與「*」號前面的數據類型無關。「*」號前面的數據類型只是說明指針所指向的內存里存儲的數據類型。所以,在 32位系統下,不管什麼樣的指針類型,其大小都為 4byte。
⑷ C語言里的指針怎麼比大小,都是地址到底誰大呀
本來就不存在誰大誰小,只有當指針是指向數組或字元串中元素時可以進行一些代數操作
如果是要比較指針指向的值的大小,請使用*操作符……但注意只有*p指向的數據類型可以比較才有效
此處是指向字元串的,大小就是p所指的元素(字元)在字元串中的前後順序
⑸ C語言指針的地址范圍是多少
C語言的指針地址范圍是4位元組空間,即從地址0x00000000~地址0xFFFFFFFF。但其中有些欄位是系統保護的或所使用的硬體平台根本就不存在,所以用戶指針並不能完全使用這個空間。不過用戶不必擔心,只要按規范使用指針,系統都會自動正確安排。
⑹ 在C語言中是不是任意的同類型指針都可以比較大小,為什麼
指針變數無非就是一個表示內存地址的長整數而已,當然可以比較。指向同一個數組時,兩個指針的大小就表示誰指向的元素靠前或靠後。如果不是指向同一個數組,比較大小就只能看出誰指向的內存空間地址較小,沒什麼意義。
對變數a的訪問有兩種方式:
一是直接按地址0x065FDF4H找到a的存儲單元,從而對變數a進行訪問;
二是按系統為p=&a分配的地址先找到p=&a,然後根據p,&a的值(即變數a地址0x065FDF4H)找到變數a在內存中的存儲單元,從而對變數a進行訪問。對於前一種訪問方式稱為直接訪問方式,後一種訪問方式稱為間接訪問方式。
(6)c語言指針大小擴展閱讀
訪問變數,首先應找到其在內存的地址,或者說,一個地址唯一指向一個內存變數,如果將變數的地址保存在內存的特定區域,用變數來存放這些地址,這樣的變數就是指針變數,通過指針對所指向變數的訪問,也就是一種對變數的「間接訪問」。
設一組指針變數pa、pb、px、py、pm、pch1、pch2,分別指向上述的變數a、b、x、y、m、ch1、ch2,指針變數也同樣被存放在內存,盡管所指向的變數類型不同,但是這些指針變數所佔內存空間都是2個位元組,而與所指向變數的類型無關。
⑺ C語言里指針指不論指向任何變數它自身都只佔4個位元組為什麼
指針存放的是內存地址.
內存地址多少位,是由編譯器決定的.
編譯器如果是32位的,那麼地址就是4位元組.
如果是64位的,那麼就是八位元組.
不會因為存放數據類型的不同而變化.
就像家裡的門牌號, 不管家裡住多少人, 是別墅還是平房, 門牌號都是街道統一規定的.
⑻ c語言關於指針比大小的問題,求解析
輸入2,3
輸入為:max=2,
min=3
注意:
swap(int
*p1,int
*p2){
int
*temp;
temp
=
p1;
p1
=
p2;
p2
=
temp;
}
函數參數p1,p2是形參(恰巧與main中的p1,
p2同名),swap只交換了參數p1,
p2的值,而沒有改變main中兩個變數p1,
p2!!
⑼ C語言中,一個指針佔用的空間是多大和指針類型有關系嗎
指針和其指向的數據類型有關系,你可以用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型的變數或是數組,就不存在一定要湊數的問題了。
⑽ c語言中,指針變數為何只佔4位元組
在C語言中,一般認為內存是一個大的位元組數組,基本單位是位元組,每一個位元組包含一個地址,有多少個地址,是有CPU的地址匯流排位數決定的,所有的地址一般稱作地址空間,比如32位的cpu,地址匯流排的位數是32位,它可描述的地址空間為0x0000 0000 0000 0000 ~ 2^32 - 1,正是因為此,所以在32位的系統上,一般指針佔4個位元組,如果是64位系統,它可描述的地址空間為0~2^64-1,如果是64位的編譯器,指針佔8個位元組。