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;
这也是赋值,但是这里*ip
是int
类型,&x
是int *
类型,不兼容。因此,您的编译器会永远警告您。
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
的原因。让人开心的小语义:)
干杯。
在定义指针变量时,我们使用的代码看起来像
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;
这也是赋值,但是这里*ip
是int
类型,&x
是int *
类型,不兼容。因此,您的编译器会永远警告您。
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
的原因。让人开心的小语义:)
干杯。