快速解答
它们是不同的,因为在您的第一个示例int *p=0; 中,您将 p 声明为指针,然后将其设置为指向地址 0x0。这一行例子相当于这两行代码int *p; p=0;
在您的第二个示例int *p; *p=0; 中,您在第一行声明了 p,但它没有初始化......所以 p 指向未定义的某个地方。在第二行中,您将转到该未定义位置的地址并尝试将该地址的值设置为 0。
您可以看到此示例与之前等效的两行示例之间的区别,因为一个使用p=0;,另一个使用*p=0;
示例
因此,在您尝试访问 *p 之前,您需要定义 p 指向的位置。假设您知道要 p 指向的整数的地址是 0x76543210。让我们看一下代码运行之前内存中的值:
// Dummy Memory Dump
// Offset: 0 4 8 C
// (0x76543200): 00000000 00000000 00000000 00000000
// (0x76543210): 00000000 00000000 00000000 00000000
// (0x76543220): 00000000 00000000 00000000 00000000
在此示例中,我将您的 *p=0; 更改为 *p=5;,以便我们可以看到内存的变化。所以现在假设我们运行这些代码行:
int *p; // Declare a pointer p
p = (int*) 0x76543210; // Set p to point at the address 0x76543210 cast to (int*)
*p = 5; // Go to the address that p is pointing to, and set the value to 5
现在如果我们回过头来看看我们的记忆,我们应该看到我们将 5 设置为 p 指向的地址:
// Dummy Memory Dump
// Offset: 0 4 8 C
// (0x76543200): 00000000 00000000 00000000 00000000
// (0x76543210): 00000005 00000000 00000000 00000000
// (0x76543220): 00000000 00000000 00000000 00000000
说明
通常,声明分为以下几部分:
[type] [name];
并且可选地,可以像这样破坏内联初始化:
[type] [name] = [value];
在这个例子中:
int *p=5;
- [类型] = (int*)
- [名称] = p
- [值] = 5
这可能会造成混淆,因为声明中的 * 附加在名称上。声明中的 * 仅表示 p 是一个指针。
但是指针的名字还是只是p。
既然我们知道了组件,我们就可以这么说
int *p=5;
等价于
int *p;
p=5;
现在更令人困惑的是,声明指针时的 * 和访问指针地址时的 * 是有区别的。
在访问时使用 * 时,它使用 p 中的值作为将要访问的地址。
在这个例子中:
int *p; // This declares a pointer p with no value
*p=5; // This line wants to go to the address that p is pointing to and set it to 5
// At this point, p is undefined because p was just declared and hasn't been set
// So it is trying to go to an unknown location to set the value 5.