C++指针混淆

C++ Pointers Confusion

本文关键字:指针 C++      更新时间:2023-10-16

在定义指针变量时,我们使用的代码看起来像

int *ip;

但是我们也可以在同一行中初始化指针以指向随机定义的变量,例如 x。

int x;
int *ip = &x;

我们还可以在另一行代码中初始化指针变量,例如,

int x;
int *ip;
ip = &x;

我的问题是,当我使用 *ip 初始化指针变量时,

int x;
int *ip;
*ip = &x;

Visual Studio给出了一个错误:

错误 C2440 '=': 无法从 'int *' 转换为 'int'

有人可以向我解释一下吗,我刚刚开始学习C++。

请注意那里的数据类型。

当你写的时候

ip = &x;

这是一个赋值语句。您正在尝试将x的地址(一个指针,基本上是int *)存储到ip中,这也是指向int的指针类型的变量(再次,int *)。都很好。

另一方面,当你尝试写作时

*ip = &x;

这也是一个赋值,但在这里,*ipint类型,&xint *的,它们不兼容。因此,您的编译器会永远警告您。


FWIW,

 int *ip = &x;

很好,因为这是初始化,而不仅仅是简单的辅助。定义时正在初始化变量ip(类型 int *)。请记住,这里定义和初始化的变量是ip,而不是*ip,这与编写有很大不同

*ip = &x;

正如我已经提到的,这是不恰当的。

我认为您的混淆仅来自声明行指针的语法。

当你声明一个指针时,你写int *p,这意味着define symbol **p** to be of type Pointer to **int**和赋值=p而不是*p提供值。

不在申报线上时,不会混淆! p是指针。*p是价值。

换一种说法...如果声明指针是由ptr2int p = &i完成的,我想它会更清楚。

这就是为什么许多人宁愿将指针类型声明为int* p而不是int *p的原因。 让人快乐的小语义:)

干杯。

注意:以下两者之间存在差异:

  • ip = &x; 在这里,您分配ip的指针,地址为 x

  • *ip = x; 在这里设置ip指向的值,值为 x

注意:*ip = &x;是两者的混合,因此不起作用