与取消引用运算符混淆
Confusion with dereference operator
为了清楚事实,我想问
int i = 1;
int *p = &i;
i = *p;
你怎么称呼p上的接线员?是否被称为与第3行中相同的取消引用运算符?
这是指针声明的一个示例:
int *p = &i;
这是一个去引用操作符的例子:
i = *p;
运算符只适用于变量,不适用于类型,它们不是一回事。
*
在本例中不是运算符,而是声明符。当应用于某个类型时,它会将其转换为指向该类型的指针。
你可以把int*
看作一种类型。
这样写会更清楚:
int i = 1;
int* p = &i;
i = *p;
int i = 1;
int *p = &i;
*
是声明语法的一部分。int *p
表示p
属于int*
类型。
i = *p;
*
是一个解引用运算符。
但两者使用相同语法并非巧合。C(看似怪异(的声明语法主要基于"声明遵循用法"的原则。
阅读声明的一种方法
int *p;
它声明CCD_ 8是CCD_。由此可知,CCD_ 10属于CCD_。类似:
int *a, b, c[20];
表示*a
、b
和c[blah]
都是int类型,因此a
是int*
类型,b
是int
类型,而c
是int[20]
类型。(请注意,声明和用法之间的对应关系并不完美;c[20]
刚刚过了数组的末尾,实际上并不存在。(
这就是为什么(至少在一个学派中(指针声明中的*
位于标识符旁边,而不是类型旁边。
这是一个指针声明,而不是一个解引用运算符。
来自cplusplus.com教程:
我想强调的是,我们在声明指针只意味着它是指针(它是类型复合说明符(,不应与我们前面看到的解引用运算符也用星号(*(书写。他们只是两个不同用相同符号表示的事物。
以这种方式定义指针
int *p = &i;
在某种程度上令人困惑。我建议你用这个(注意空格(
int* p = &i;
但当以这种方式定义多个指针时,会出现一个问题:
int* p = &i, * q = NULL;
因此,更清楚地说,首先定义指针类型,并使用该类型来定义变量:
typedef int* int_ptr;
int_ptr p = &i, q = NULL;
相关文章:
- 取消引用运算符不能重载
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 标准库类型的赋值运算符的引用限定符
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- C++编程:运算符重载中的引用如何工作?
- 重载运算符*以获取对另一个类的实例的引用
- 使用 scope 运算符 (::) 引用另一个文件中的类
- 对运算符=使用通用引用,而不是多个重载
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 未定义的引用和运算符 << vs me
- 为什么我不能在运算符=中使用引用类型?
- C++:对函子重载调用运算符的未定义引用
- 运算符重载C++类中的引用返回
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 对模板运算符的未定义引用,其定义位于同一头文件中
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 运算符++:引用与值返回和未使用的参数