声明指针的方法?

时间:2011-12-12 18:25:09

标签: c++ pointers

为什么以下代码编译:

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,这对我来说没有意义。

7 个答案:

答案 0 :(得分: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}}。

答案 1 :(得分:3)

*jp = &j;

这就在这里。记下*。这将获取指针指向的数据,类似于->对象所做的操作。你在这里做的是为int分配一个内存地址。指针jp指向一个名为*jp的int。

简而言之,jp是指向int(因此是地址)的指针,*jpjp指向的int。使用&j可以获得j的地址或指向它的指针。

答案 2 :(得分:1)

改变这个:

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

进入这个:

jp =& j; 

这将使其编译。

int *jp = &j;编译的原因是因为它声明了初始化值。在非编译代码中,您正在执行分配。并尝试将整数表达式(*jp)分配给指针1(&j)。这根本没有意义。

如果你这样做:

jp = &j;

然后它将编译,因为您正在将指针表达式(&j)分配给指针变量(jp)。在这种情况下有类型一致性,所以它是有意义的编译。

答案 3 :(得分:0)

*jp =& j;说“将&j的值写入jp指向的位置”。这是错误的a)因为jp没有指向任何东西而b)因为&j是指针而jp指向的值应该是int,而不是指针。< / p>

答案 4 :(得分:0)

int *jp = &j;jp声明为int*(指向int的指针),并使用&j(地址j)初始化它。

*jp = &j取消引用指向j的指针(提供对j的引用),然后尝试将&j指定给j。这是非法的,因为jint&jint*

答案 5 :(得分:0)

你正在解决你的错误。

声明:

int *jp = &j;

真的应该被解读为:

int* jp = &j;

导致肌动蛋白:

  • jp声明为指向整数的指针
  • &j的值分配给jp

匹配第二个代码块的更正:

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

答案 6 :(得分:0)

由于初始化分配之间的区别,你会被绊倒;这两者是不同的东西。

该行

int *jp = &j;

jp声明为int的指针,使用表达式&j的结果初始化,其类型为“指向int的指针”({ {1}})。

该行

int *

尝试将表达式*jp = &j; (具有类型&j,记住)的结果分配到表达式int *的结果(具有键入*jp 1 )。由于两个表达式的 types 不匹配,因此会出现编译时错误。

请注意,int尚未初始化为指向任何有意义的地方的事实将是运行时错误,而不是编译时错误; IOW,如果您已经编写了jp,程序将编译就好了(表达式*jp = 5;*jp具有兼容的类型),但会有(当你试图运行时,它很可能会被炸毁

<小时/> 1 C和C ++中的声明基于表达式的类型,而不是对象。例如,我们将5声明为指向jp的指针。要检索指向的整数的,我们取消引用指针与int运算符,如语句

*

表达式 x = *jp; 的类型是*jp,因此指针的声明是

int