C++:在没有解引用运算符的情况下访问“数组指针”的值?

Posted

技术标签:

【中文标题】C++:在没有解引用运算符的情况下访问“数组指针”的值?【英文标题】:C++: Accessing the values of an "array pointer" without the dereferencing operator? 【发布时间】:2021-04-05 20:06:25 【问题描述】:

抱歉,如果这个问题已经被问过,但是关于 C++ 数组和指针的问题太多了,我可以一一解答。

假设我们像这样声明一个双精度数组:

double val[3] = -3.1415, 6.2430, +37;

// Declare and initialize pointer variable: 
double * pointer = &val[0]; 
cout << "Elements of the array are: " << endl; 
cout << pointer[0] << " " << pointer[1] << " " << pointer[2] << endl; 

让我感到困惑的是,我如何获得存储在双精度数组val 中的正确值作为输出,而不必使用解引用运算符 *,例如*pointer[0]..

【问题讨论】:

operator[]() 只是一个内存偏移操作。这就是它对常规数组的工作方式,也是它对指针的工作方式。 a[b] 的定义与*(a + b) 相同,所以有你的* 您想要这个:https://ideone.com/6iuoAf 吗?我对你在问什么问题感到困惑。 对于像 MyArray[Index] 这样的 c 样式数组,相当于 *(MyArray + Index),因此您可以使用(内置)* 运算符取消引用 @UlrichEckhardt 请问:为什么指针[1] 表示*(pointer + 1)?这是它的编码方式吗?谢谢。 【参考方案1】:

pointer 指向压缩双精度数组中的第一个双精度。

pointer[1] 意味着 *(pointer+1) 的基本方式非常荒谬,以至于 1[pointer] 有效。 (顺便说一句,不要那样做)

如果你有一个数据数组,那么在指向第一个元素的指针上加 1 会得到指向第二个元素的指针。

【讨论】:

请问:为什么pointer[1] 就是*(pointer + 1)?这是它的编码方式吗?谢谢。 还有:*(pointer + 1)这个表达式怎么理解?我会将其重写为*pointer + *1 = val[0] + *1,但*1 是什么? 您的重写无效。指针上的算术(加/减)遵循特殊规则,它以指针类型的倍数运行。所以,pointer + 1 会给你下一个对象的地址。即使 C++ 也使用 * 进行乘法运算,但这并不意味着您可以在取消引用时应用对乘法有效的规则。

以上是关于C++:在没有解引用运算符的情况下访问“数组指针”的值?的主要内容,如果未能解决你的问题,请参考以下文章

一级指针,二级指针,指针数组,数组和指针

C++数组,指针,引用以及三者的复合类型

C语言学习 -- 指针

解引用指针并存储对指向数据的引用,然后获取引用地址并对其执行指针运算。 C++

在没有显式命令的情况下在函数调用之间清除数组指针数据?

C++ 对象的动态建立 & 释放