C++ 如果int*a=*b,a会指向b引用的对象吗?
或者地址a是否等于b引用的整数 还是会发生其他事情C++ 如果int*a=*b,a会指向b引用的对象吗?,c++,c,C++,C,或者地址a是否等于b引用的整数 还是会发生其他事情 编辑:另外,如果double*a=3.0,a是否指向3.0?*a=*b,这意味着将地址为b的内存内容复制到地址为a的内存中 if(*a==*b)这意味着:检查地址为a的内存内容是否等于地址为b的内存内容 如果int*a=*b,a会指向b引用的对象吗 这取决于b是什么 编辑:另外,如果double*a=3.0,是否会将点设置为3.0 不,这是一个无效的语句。您应使用地址初始化a 它必须给你警告。。。不使用强制转换将int转换为int* 这还取决于
编辑:另外,如果double*a=3.0,a是否指向3.0?
*a=*b
,这意味着将地址为b
的内存内容复制到地址为a
的内存中
if(*a==*b)这意味着:检查地址为a
的内存内容是否等于地址为b
的内存内容
如果int*a=*b,a会指向b引用的对象吗
这取决于b
是什么
编辑:另外,如果double*a=3.0,是否会将点设置为3.0
不,这是一个无效的语句。您应使用地址初始化
a
它必须给你警告。。。不使用强制转换将int
转换为int*
这还取决于什么是p
请尝试以下操作:
#include <stdio.h>
int main(void)
{
int val = 5;
int *b = &val;
int *a = *b;
printf("&val = %p; b = %p, a = %p\n", &val, b, a);
return 0;
}
(地址值可能会更改)
a
实际上是一个指针,其值是b
指向的。除非b
本身是指向指针的指针,a
可能会指向无效位置。如果代码是int*a=*b
则*b
是指向整数的指针(必须与a
的类型匹配)。这意味着b
是指向整数的指针a
将包含*b
指向的地址,而不是b
指向的地址
但是,如果代码是
int*a*a=*b代码>那就不同了。在这种情况下,您正在将b
指向的对象复制到a
指向的地址中。对象必须是整数,因此a
将指向整数的副本(因此您可以更改*b
,而*a
不会更改)。顺便说一句,如果a
处于未初始化状态,这将是未定义的行为(很可能是崩溃)。您问题的第一部分没有意义,因为您没有提供有关b
的信息
至于第二部分(大约double*a=3.0
)。。。C语言和C++语言都禁止用非指针值初始化指针(除了空指针常数)。这就意味着<代码>双*A=3 < /COD>不是有效的C或C++代码。它根本无法编译。例如,这同样适用于int*a=5
code
<>在C和C++中,为了将非指针值转换为指针类型,需要一个显式的转换。此类强制转换的结果由实现定义。指针是任何变量的引用,并存储其中其他变量的位置。。。
你的例子应该是:
双a=3.0;
int b*=a
因此指针(B)将引用值为3.0的变量(A)它将是标题中的变量,但B
可能是nullptr
或其他什么代码>不应该编译。这个问题毫无意义。int*a=*b
应该是什么意思?什么是b
,它是从哪里来的?我从一本编程书中得到了这个例子,函数被传递了参数**b.@badatmath:重要的是b
的类型<代码>**b
也没有说明它的类型。什么是完整的<代码> B<代码>?代码在C和C++中都无效。使用*b
值初始化指针int*a
是非法的,它具有int
类型。它可能在语义上无效,但我编译并运行了它;甚至没有生成警告。这意味着您的编译器被故意设置为“非常松散”的语言一致性。我知道有些编译器会为这样的代码生成警告,虽然形式上已经足够了(这种语言需要诊断消息,任何诊断消息),但这种警告已经“松散”了。但是如果你的编译器根本没有生成任何消息。。。真奇怪。
&val = 0xbfb652d4; b = 0xbfb652d4, a = 0x5