为什么以下代码编译:
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;
}
Run Code Online (Sandbox Code Playgroud)
但不是吗?
#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;
}
Run Code Online (Sandbox Code Playgroud)
我这样编译jp = &j,为什么?我只是jp在另一行初始化,这对我没有意义.
int *jp;
Run Code Online (Sandbox Code Playgroud)
jp是一个指针.它的value(jp)是一个内存地址.它指向(*jp)一个整数.当你这样做
jp = &j;
Run Code Online (Sandbox Code Playgroud)
这将值设置为内存地址j.所以现在*jp指出j.当你这样做
*jp = &j;
Run Code Online (Sandbox Code Playgroud)
这设置了事物jp的值指向的内存地址j.当你这样做时:
int *jp;
*jp = &j;
Run Code Online (Sandbox Code Playgroud)
jp还没有指向任何东西 - 它的价值是未初始化的.*jp = &j尝试跟随值的内存地址jp,这是随机的,并将其设置为&j...这可能会导致段错误.
澄清:*in(int *jp;)与in不同*jp = ....前者只是声明jp为指针.后者定义了如何进行分配.为了使它更加明确,做:
int *jp = &j;
Run Code Online (Sandbox Code Playgroud)
是相同的
int *jp; jp = &j;
Run Code Online (Sandbox Code Playgroud)
请注意*,作业没有.