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

错误:从“int”到“int *”的无效转换
int *q = 8;

工作良好。
*q = 6;

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

因为它们完全不同。 第一个是使用初始化表达式定义变量,即初始化 (指针本身):

 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; 表示使用int*类型定义名为p的变量,并使用6初始化它,因为6不能用于直接初始化指针(即错误“从’int’到’int *’的无效转换”)。

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

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

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

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

这个:

 int *q = 8; 

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

 int *q; q = 8; 

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

只是为了确定,如果你写:

 int *q; *q = 8; 

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

因为类型不匹配。

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

当你执行*q = 6 * 取消引用指针,因此类型变为int (或者更确切地说是lvalue int ,即可以分配给它的东西)。

在这里,将值8赋给int*类型的对象。 它表示内存地址为8 q点。

  int *q = 8; 

相当于

 int *q; q = 8; 

不等于

 int *q; *q = 8; 

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

相关的堆栈溢出问题: 是否可以将C指针初始化为NULL?

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

 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; 

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

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

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

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

*q = 6;情况下*q = 6; 你为一个int赋予一个int,这当然是完全正确的(假设指针指向某处的已分配内存)。

如果你像这样重写它:

 int* q = 8; *q = 6; 

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

尝试

 int *q = new int(8); 

但通常不需要在这里使用指针。 如果必须使用指针,请使用智能指针shared_ptruniqe_ptr

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