2011-12-12 64 views
0

爲什麼下面的代碼編譯:如何聲明一個指針?

int main() 
{ 
    int j = 1; 
    int *jp = &j; 

    cout << "j is " << j << endl; 
    cout << "jp is " << jp << endl; 
    cout << "*jp is " << *jp << endl; 
    cout << "&j is " << &j << endl; 
    cout << "&jp is " << &jp << endl; 
} 

,但不爲呢?

#include <iostream> 
using namespace std; 
int main() 
{ 
    int j = 1; 
    int *jp; 
    *jp =& j; // This is the only change I have made. 
    cout << "j is " << j << endl; 
    cout << "jp is " << jp << endl; 
    cout << "*jp is " << *jp << endl; 
    cout << "&j is " << &j << endl; 
    cout << "&jp is " << &jp << endl; 
} 

這個編譯當我做jp = &j,爲什麼?我只在另一行初始化了jp,這對我沒有意義。

+0

你在編譯時會得到什麼錯誤? –

+0

prog.cpp:9:錯誤:從'int *'無效轉換爲'int'結果:編譯錯誤 – user1084113

+0

感謝您的快速回復傢伙,你的答案真的幫了大忙。 – user1084113

回答

6
int *jp; 

jp是一個指針。它的值(jp)是一個內存地址。它指向(*jp)整數。當你做

jp = &j; 

這將值設置的j內存地址。所以,現在*jp將指向j。當你做

*jp = &j; 

這臺的jp指着到j的內存地址的東西值當你這樣做:

int *jp; 
*jp = &j; 

jp尚未指向任何內容 - 其值未初始化。 *jp = &j試圖跟隨內存地址jp,這是隨機的東西,並將其設置爲&j ...這可能會導致段錯誤。


澄清:在(int *jp;)的*是不同的一個比在*jp = ...。前者只是聲明jp作爲指針。後者定義你如何完成任務。爲了使其更加明確,這樣做的:

int *jp = &j; 

相同

int *jp; jp = &j; 

注意,在分配沒有*

1

更改此:

*jp =& j; //this is the only change I have made, 

進入這個:

jp =& j; 

這將使編譯。

原因int *jp = &j;編譯是因爲它聲明瞭正在初始化一個值。在非編譯代碼中,您正在執行賦值。並嘗試將一個整數表達式(*jp)分配給一個指針(&j)。這根本沒有意義。

如果你這樣做:

jp = &j; 

然後它會編譯,因爲你是爲指針變量(jp)分配一個指針表達式(&j)。在這種情況下有類型一致性,所以編譯它是有意義的。

+0

是的,我注意到了,但爲什麼? – user1084113

+0

@ user1084113:我試着詳細闡述一下,並更新了答案。 –

0

*jp =& j;表示「將&j的值寫入jp指向的位置」。這是錯誤的a)因爲jp不指向任何東西b)因爲&j是一個指針而且jp指向的值應該是一個int而不是一個指針。

3
*jp = &j; 

這就是這裏。請注意0​​。這會得到指針指向的數據,類似於->對於對象所做的。你在這裏做的是分配一個內存地址給一個int。指針jp指向一個名爲*jp的int。

總之,jp是指向int(因此是地址)的指針,而*jp是指向jp指向的int。使用&j可以獲得地址j或指向它的指針。

0

int *jp = &j;聲明jp是一個int*(指針爲int),並用&j(的j地址)初始化它。

*jp = &j取消引用指針j(給予j的引用),然後嘗試分配&jj。這是非法的,因爲jint&jint*

0

你在錯誤地解析它。

聲明:

int *jp = &j; 

真的應該被解讀爲:

​​3210

導致肌動蛋白:

  • 聲明jp作爲一個指向整數
  • 分配值&j到日本

,你的第二個代碼塊的校正相匹配:

int *jp; 
    jp = &j; // This is the only change I have made. 
0

你得到由初始化分配之間的差別絆倒了;兩者是不同的東西。

int *jp = &j; 

聲明jp作爲指針以int與表達&j,其類型爲 「指針爲int」(int *)的結果初始化它。

*jp = &j; 

嘗試分配表達&j(其具有類型int *,記住)到表達式*jp(其具有式int )的結果的結果。由於兩個表達式的類型不匹配,所以會出現編譯時錯誤。

請注意,jp尚未初始化以指向任何有意義的事實,但將會是運行時錯誤,而不是編譯時錯誤; IOW,如果你寫了*jp = 5;而不是編譯就好了(表達式*jp5有兼容類型),但是當你試圖運行它時會(很可能)炸掉。


C和C++中的聲明基於 表達式的類型,而不是對象。例如,我們聲明 jp作爲指向 int的指針。要檢索 價值被指出,我們解引用指針與*操作,整數的在聲明

x = *jp; 

的類型表達*jpint的,所以申報指針是

int *jp;