这两个是等价的吗?
int a=10;
int *p=a;
AND
int a=10;
int *p;
p=&a;
在这两种情况下 p 都持有 a 的地址吗!?
在第一种情况下, 的值a
被复制到p
(其中存储了一个地址),因此p
指向地址 10。
在第二种情况下,p
指向 的地址a
。
还有第三种情况:
int a = 10;
int *p = malloc(sizeof(int));
*p = 10;
在这种情况下, 的值被复制到(由 保留)a
所指向的地址中p
malloc()
在第一种情况下
int a=10;
int *p=a;
将变量 a 中包含的值放入变量 p 中。所以变量 p 的值为 10。
在第二种情况下
int a=10;
int *p;
p=&a;
变量a的值为10,变量p的值为a的地址。
在第一种情况下,即使变量 p 被声明为指向 int 的指针,放入变量 p 的值也是变量 a 的值,值为 10。在第二种情况下,您将放入变量的地址a 到变量 p 中。
只有第二种情况在技术上是正确的。在第一种情况下,您将of的值a
分配给 `p˙,因此您将整数分配给指针 - 它可能有效,但并非必须如此。
在第二种情况下,您正确地将a
to的地址p
,即 an分配int *
给一个int
变量 - 这很好。
请注意,即使将变量声明为指针,编译器也不会自动获取右侧表达式的地址(因为在某些情况下它根本没有意义,例如使用指针文字...... )
尝试:
int main()
{
int a=10;
int *p=a;
}
然后编译:
> g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:4: error: invalid conversion from ‘int’ to ‘int*’
所以不是有效的 C++,因为 a 不是指针。C 在类型信息上稍微宽松一点将允许这样做。但你确实得到了你所要求的。的值p
是a
(10)的值。指向地址 10 的指针也是如此p
(这是否是有效地址是实现定义的)。
第二个版本在两种语言中都有效。
因为您获取了 的地址,a
因此类型对于分配给 . 是正确的p
。结果是p
指向a
。
第一种情况不正确,因为指针应该有一些地址指向,然后值应该去那个地址。在第一种情况下,值转到未指向的地址,因此出现错误。
In the Second case the pointer starts pointing at the variable's address in the start. Hence it points to the address containing the value which is correct.