2017-04-16 80 views
-1

我在查詢時遇到了一些基本的c問題。我嘗試下面的代碼來解決它:爲什麼遞增一個浮點數的結果與預期不同?

#include<stdio.h> 
typedef float mytype; 
mytype q=1; 
mytype *x=&q; 
mytype *y=&q; 
mytype *z=&q; 
mytype *a=&q; 
mytype *b=&q; 
mytype *arr[5]={x,y,z,a,b}; 
int main() 
{ 

     printf("********************"); 
     //printf("%u\n",sizeof(int*)); 
     printf("%u\n",sizeof(double*)); 
     printf("********************\n"); 
    for(int i=0;i<5;i++) 
    { 
     printf("%p\n",arr[i]); 
     printf("%p\n",arr[i]+1); 
     printf("***********"); 
    } 
} 

當我執行它,浮動的sizeof指針爲8個字節,但增加它導致的是隻有4個字節的地址away.Can有人請解釋爲什麼會這樣?

+4

「當我執行它,漂浮的sizeof指針」 - 你沒有得到的大小一個'浮點'指針!爲什麼指針的大小應該與它指向的對象的大小有關?有很多錯誤的假設它代碼很少。 – Olaf

+2

'size_t'的正確格式說明符是'%zu'而不是'%u'。 –

回答

0

您正在64位系統上運行。指向內存地址的指針大小爲8個字節,但浮點大小僅爲4個字節(因爲浮點數是單精度浮點數)。

在64位系統上,所有指針的長度均爲8個字節,以允許尋址內存地址> 4GB。

當你增加指針時,你將它增加一個長度爲4個字節的浮點大小,所以指針增加4個字節。

+0

「當你增加指針時,你增加了足夠的空間來增加1個浮點數」 - **肯定不是!**增加一個指針不會增加任何空間。 – Olaf

+0

@Olaf你說得對,我的措辭令人困惑,我改變了它 – beeselmane

2

指針的大小在64位系統上是8個字節。指針所引用的大小是4個字節。

例如,在64個系統float foo

sizeof(&foo)爲64位

sizeof(foo)是32位

相關問題