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给出了一个错误:
错误 C2440 '=': 无法从 'int *' 转换为 'int'
有人可以向我解释一下吗,我刚刚开始学习C++。
请注意那里的数据类型。
当你写的时候
ip = &x;
这是一个赋值语句。您正在尝试将x
的地址(一个指针,基本上是int *
)存储到ip
中,这也是指向int
的指针类型的变量(再次,int *
)。都很好。
另一方面,当你尝试写作时
*ip = &x;
这也是一个赋值,但在这里,*ip
是int
类型,&x
是int *
的,它们不兼容。因此,您的编译器会永远警告您。
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;
是两者的混合,因此不起作用
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错