C++ 指针混淆

C++ Pointers Confusion

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

int *ip;

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

int x;
int *ip = &x;

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

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

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

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

Visual Studio报错:

Error C2440 '=': cannot convert from 'int *' to 'int'

谁能给我解释一下,我才刚开始学C++。

请注意那里的数据类型。

写的时候

ip = &x;

这是一个 assignment statement。您正在尝试将 x(一个指针,基本上是 int *)的地址存储到 ip 中,它也是指向 int 的指针类型的变量(同样,int *).一切顺利。

另一方面,当你尝试写

*ip = &x;

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


FWIW,

 int *ip = &x;

很好,因为这是 initialization,不仅仅是一个简单的赋值。您在定义时正在初始化变量 ip(类型 int *)。请记住,这里定义和初始化的变量是 ip,而不是 *ip,这与写

有很大不同
*ip = &x;

(正如我已经提到的,这是不正确的。)

注意:有区别:

  • ip = &x;这里给指针ip分配地址x

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

注意:*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 的原因。让人开心的小语义:)

干杯。