2015-06-30 48 views
-4
#include<stdio.h> 
int main() 
{ 
    int i = 5; 
    float a = 3.14; 
    char*ii,*aa; 

    ii = (char*)&i; 
    aa = (char*)&a; 
    printf("address contained in ii=%u\n",ii); 
    printf("address contained in aa=%u\n",aa); 
    printf("value at address contained in ii=%d\n",*ii); 
    printf("value at address contained in aa= %d\n",*aa); 
    return(0); 
} 
/*the output for the following program was 
    address contained in ii=65524 

address contained in aa=65520 
    value at address contained in ii=5 

    value at address contained in aa=-61*/ 

一個什麼是ii = (char*) &iaa = (char*) &a也意義爲什麼在ii地址編譯器打印值是正確的,並在aa是錯誤的?如果您使用其他值i,比如327,則ii中包含的地址值將變成別的東西。有人可以向我解釋嗎?我無法從編寫代碼的書中得到正確的解釋。是什麼II =(字符*)的含義與我和=(字符*)在下面的代碼

程序源代碼:理解c中的指針。作者:yashvant kanetkar,第4版。

+1

該程序有問題,它可能很舊。要打印指針的地址,您需要將其轉換爲'void *'並使用'「%p」'printf()'說明符。該程序也是不正確的,作者通過別名指針解引用指針,該別名指針調用未定義的行爲。 –

+1

該程序不應該編譯。你是如何得到*輸出*的? –

+0

@BlueMoon我沒有看到'float a = 3,14'。 –

回答

1

在書中給出的方案是什麼不該做的例子:

不要試圖通過指針訪問值當指針不是指向同一類型的原始值。

在這本書中,iint,但代碼故意使char*指向整數。所以,當ii被取消引用時,你只會得到一個值似乎是char

編輯:因此,表達式(char*)&i;第一取的i的地址,其中所述編譯器認爲類型int*中,然後將型轉換爲char*而不改變指針的值。

不同類型的指針需要注意的重要一點是它們通常意味着指向的對象的大小不同。

另請注意,所有整個程序的輸出將取決於您使用的平臺。

+0

同意.....但是聲明(char *)和我做了什麼?它是否使ii認爲存儲在其中的地址是字符的地址? – rookie

相關問題