为什么以下代码编译:
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 :(得分: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
(因此是地址)的指针,*jp
是jp
指向的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
。这是非法的,因为j
是int
而&j
是int*
。
答案 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
具有兼容的类型),但会有(当你试图运行时,它很可能会被炸毁
5
声明为指向jp
的指针。要检索指向的整数的值,我们取消引用指针与int
运算符,如语句
*
表达式 x = *jp;
的类型是*jp
,因此指针的声明是
int