2012-08-24 58 views
-5
#include<stdio.h> 

#define int int* 

main(){ 
    int *p,q; 
    p=(int *)5; 
    q=10; 
    printf("%d",q+p); 
} 

我的問題是,在線路p=(int *)5,並q=10它是如何工作的內部正是因爲pq都是指針類型,怎麼可能,我們可以指定一個整型值指針變量q?。還有一件事這種類型鑄造p=(int*)5這裏工作?勘定/鑄造整數爲指針

通過使用這個公式,我們可以回答

新地址=他們的邏輯意義的舊地址+號*的sizeof數據類型到指針指向

+9

'#define int int *' - 邪惡的主腦:P –

+0

是p =(int)5還是p =(int *)5? –

+5

由於#define,這只是無用的代碼,在現實世界的應用程序中沒有用處。沒有必要詳述它的功能。 – Lundin

回答

1

#define int int*將取代int *p, qint* *p, q。所以這裏p是雙指針intqint類型。

例如,請考慮您的相同的邏輯的以下程序焦炭

#include<stdio.h> 
#define char char* 
main() 
{  
    char *p,q;  
    printf("%d, %d\n", sizeof(p), sizeof(q)); 
} 

輸出是

4, 1 

p=(int *)5; - 這種說法也將像p=(int* *)5;通過preporcessor取代。所以它不會發出任何警告。

所以現在printf("%d",q+p);會給你45的情況下,32位機器或85 incase的64位機器。

0

指針作爲事實上的計算機的所有數據,而不管,以數字身體實施。

在指針的情況下,通常數字是虛擬地址;因此,當您手動爲指針賦值時,您正在設置一個虛擬地址。

碰巧的虛擬地址通常從0到CPU的地址總線寬度,讓您擺脫它 - 除了地址尚未分配和acccess這將導致異常課程。然而有時候(典型的沒有虛擬內存的嵌入式系統)地址是物理的,而不是虛擬的,一些硬件設備(時鐘,寄存器等)具有已知的物理地址,這些地址被手動分配給指針,然後指針被讀取從/寫入。

0

P =(INT *)5;

地址00000005上的變量p點。如果試圖將值更改爲該地址,則可能導致其他數據的損壞以及不可預測的程序運行時間。 例如

**p=10 

導致異常

未處理的異常:訪問衝突寫入位置0x00000005。

嘗試printf(「%p」,p)在下次操作之前查看poiner p的初始地址。

的printf( 「%d」,Q + P);

這裏地址算術的魔法開始了..您可以將指針q的地址添加到另一個指針。所以指針在地址空間的新位置移動。試試這個:

p = p+ q 
printf("%p",p);