为什么我不能直接将int赋给int指针,如下所示:int * p = 6;?

时间:2017-07-07 09:12:33

标签: c++ c pointers initialization variable-assignment

错误:来自' int'的无效转换to' int *'
int *q = 8;

工作正常。
*q = 6;

为什么我不能直接将int赋给int指针,如下所示:int *q = 6;我可以在下一行安全地分配它吗?

13 个答案:

答案 0 :(得分:22)

因为他们完全不同。第一个是带有初始化表达式的变量的定义,即initialization(指针本身):

int *         q                      = 8;
~~~~~         ~                      ~~~
type is int*; name of variable is q; initialized with 8

第二个是赋值(指针所指向的对象):

*q                              = 6;
~~                              ~~~
dereference on q via operator*; assign the resulting lvalue pointed by q to 6

并且,int *p = 6;表示定义名为p且类型为int*的变量,并使用6对其进行初始化,但由于6无法执行,因此失败用于直接初始化指针(即错误"从' int'到' int *'")的无效转换。

答案 1 :(得分:14)

*符号会重复用于代码段中的两个不同的purpuses。第一次将它用作类型声明int *的一部分,声明指向int的指针。第二次,它用于取消引用指针*q,调用间接运算符。

*也可用于调用乘法运算符*q = *q * *q;;

要为指针指向的整数赋值,需要取消引用它。并且为指针本身(即int *q = 8;正在做的事情)指定除0以外的整数值需要reinterpret_cast,因此您会收到此错误。

答案 2 :(得分:6)

语句int *q定义了“指向整数的指针”类型的变量,因此初始化需要是指针值,而不是整数值。 所以int *q = 8int *q; *q = 8不同(这是未定义的行为,因为它取消引用未初始化的指针),但更像是int *q; q = 8,这使得误解更加透明。

答案 3 :(得分:5)

此:

int *q = 8;

是初始化。它初始化q(指针),而不是*q(它指向的是什么)。使用赋值而不是初始化等效地写这个看起来像:

int *q;
q = 8;

所以你看它没有意义。 (并且,当然不允许 - int不是指针)

只是要确定,如果你写:

int *q;
*q = 8;

这是语法正确,但未定义的行为。您的指针不指向int类型的对象,它未初始化并可能指向某个无效位置。写在那里,任何事情都可能发生。

答案 4 :(得分:3)

因为类型不匹配。

6本身不是指针类型的值,它是一个整数,所以它不能直接存储在指针中。

*q = 6 * 取消引用指针时,类型变为int(或者更确切地说是左值int,即某事可以分配给。)。

答案 5 :(得分:3)

此处,将值8指定给类型为int*的对象。这意味着q点在内存上的地址8上。

 int *q = 8;

等效

int *q;
q = 8;

不等同于

int *q;
*q = 8;

非法,因为它涉及约束违规

相关堆栈溢出问题:Is it possible to initialize a C pointer to NULL?

答案 6 :(得分:3)

指针变量包含某个地址或“位置”。因此,指针保持作为存储器地址的值。当你说:

int *q = 6;

你正在创建一个指针变量,它意图指向一个int,并告诉它指向存储在地址6中的int值,这可能(可能)不是你真正想要的。

指针变量应指向某个包含您要访问的实际数据的内存地址。例如:

int x = 5;
int *q = &x;

这将创建一个包含值5的变量(x)。 下一行创建一个包含x地址的指针变量。您已将指针变量'q'设置为int变量'x'的地址。

现在你可以通过这样做看到'x'的内容:

int y;
y = *q;

这表示“采用q指向的内容,并将其存储在y中”。最终结果是y将被设置为5.

int x = 5;     // create variable x and set it to 5
int *q = &x;   // create int pointer variable, set it to the address of x
int y;         // create variable y
y = *q;        // take the value pointed to by q, and store it in y

例如,如果变量x在内存位置1234,并且您查看了存储在'q'中的值,那么它将是1234,这是x的地址。 当你说“y = * q”时,你说的是“取存储在地址1234中的值,并将该值放入y”。由于存储器位置1234是'x',并且'x'被赋值为值5,因此值5将存储在地址1234处。

y = *q;

将获取存储在地址1234中的值并将y指定给该值,从而使y 5,即存储在x中的值,即q'指向​​的值。

这可以缩短为:

int x = 5;
int *q = &x;
int y = *q;

答案 7 :(得分:2)

当你写作时 int *q = 8;这意味着您声明了一个指针q并使用整数8初始化了一个指针。但是q是一个指针需要address value,因此您会收到错误说明不兼容。
而你写的时候 声明后,*q=8表示您正在取消引用q指向的地址并将值写入该位置。此处q指向int,因此您将8整数值写入q指向的位置。这是对的。如果q未初始化为指向正确的位置,这也可能导致运行时出错。

答案 8 :(得分:1)

在您的第一个语句中,您声明并初始化指向某个类型int的值的指针(在同一行上)。在第二个语句中,您正在更改指针指向的值。两件不同的事情。你有什么是初始化,然后是一个任务。不要让*混淆你。

答案 9 :(得分:0)

因为它无效C,所以简单。具体来说,它是赋值运算符的约束违反,因为整数到指针或指向整数的指针不是有效形式的简单赋值" (C11 6.5.16.1)。

您可以通过添加显式强制转换来转换整数和指针。但是结果不能保证工作:指针和整数可能有不同的表示形式,可能存在对齐问题。

如果是*q = 6;,你将一个int分配给一个int,这当然是完全正常的(假设指针指向某处的已分配内存)。

答案 10 :(得分:-1)

如果你像这样重写:

int* q = 8; 
    *q = 6;

然后您可以看到*有两个不同的目的。

答案 11 :(得分:-1)

尝试

int *q = new int(8);

但通常不需要使用指针。如果必须使用指针,请使用智能指针shared_ptr<int>uniqe_ptr<int>

答案 12 :(得分:-1)

在这种情况下,您将值8分配给指针* q并且它在初始化期间不起作用,此时内存地址是唯一的,不能分配,但您可以设置一次在* q初始化后创建的内存块。