2011-12-12 65 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;