2015-10-14 78 views
-2

對於下面的代碼值* IP的印刷,因爲它指向的變量的地址

int main() 
{ 
    int x = 2; 
    int *ip = &x; 
    printf("%d",*ip); // Printing the value of *ip gives 2 
        //Now if the value of ip is incremented 
    ip++; 
    printf("%d",*ip); //Printing the value of *ip gives the incremented memory   
} 

可有人請,如何的*ip值越來越打印爲增加的內存位置說明。 *ip作爲參照運算符應該返回地址右邊的值嗎?

+2

啓用所有編譯器警告,看看是否有幫助。 –

+0

你的意思是做'(* ip)++'嗎?我假設你想通過你的指針增加'x',而不是增加你的指針。 –

+3

int * ip = x實際上意思是,將ip聲明爲int指針,並將ip(它是int)的值賦給ip(這是一個指向int的指針) –

回答

2

此代碼可能不可預測的行爲,因爲

int *ip = x; 

分配x的值,向一個指針。 基本上它硬編碼2到指針IP中。

它可以用警告編譯。 它可能會在運行時導致內存錯誤。

+0

嗨,我很抱歉這個小故障,我已經更正了它是&x不是x的行,現在可以請您看看問題 – Akash

+0

是的,這解決了第一個問題。丹尼爾史蒂文斯解釋說,它仍然存在第二個問題。代碼正在增加ip,它現在指向代碼本身沒有分配的堆棧位置。因此,它會打印出那裏發生的任何事情,這是一種不可預知的行爲。 –

5

我看到兩個代碼錯了。一行是這樣的:

int *ip = x; 

這試圖將一個int的值賦給一個指針。這可以強制使用編譯器標誌,但應該給出錯誤。儘管如此,我懷疑這可能是你的問題的一個錯字,因爲取消引用2的地址幾乎肯定會崩潰,但是你聲稱它運行併產生了2的輸出。我會假設你實際上有:

int *ip = &x; 

第二個問題是:

ip++; 

在這裏,你是遞增的指針,而不是詮釋它指向。我認爲你想要的(增加2到3)是:

(*ip)++; 

也就是增加指針指向的值。

如果增加指針,它將指向堆棧上的其他位置,這可能是另一個局部變量(如指針本身),或者返回地址,堆棧幀指針或其他隱藏值。新值很可能是某種類型的指針,其值與您的指針地址相似,否則將看起來像打印指針的輸出。當然,你不應該增加一個指向單個元素的指針。這從來不是一個好主意。

+0

嗨,對於第一部分,我很抱歉,這個問題被錯誤地打印出來了,應該是&x not x,謝謝你的糾正。對於你提到的第二個,* ip ++也可能像(* ip)++,問題是關聯性的。對於(* ip)++,沒有任何問題,因爲內存位置中包含的值(如ip指向的)會增加。我試着用* ip ++來查看結果,發現這次打印的值是遞增的內存位置,但是在那個位置沒有值。總之,指針ip指向一個未初始化的整數位置 – Akash