【问题标题】:Pointers and dereferenced pointers指针和取消引用的指针
【发布时间】:2013-12-16 15:04:33
【问题描述】:

我在头文件中有这个声明

private:
MyIntegerClass *myArr;
MyIntegerClass myIntegerClass;
MyIntegerClass *ptr_myIntegerClass = &myIntegerClass;

MyIntegerClass 是一个类,它有一个包含整数的数据成员。它有两个成员函数——一个访问器和一个修改器。

这是 Array-class 的 cpp 文件 - 为数组分配内存的类,并用值填充数组并最后打印数组

Array::Array() {

    myArr = new MyIntegerClass[10];
    for (int i = 0; i < 10; i++) {
           ptr_myIntegerClass->setNumber(i);
           myArr[i] = *ptr_myIntegerClass;
    }
}

Array::~Array() { }

void Array::printArray() {
    for (int i = 0; i < 10; i++) {
        cout << myArr[i].getNumber() << endl;
}

我是 C++ 新手,我对 C 有一定的了解,并且通过反复试验使这个程序可以编译和打印这些值而没有错误。但是有几件事我不明白:

  • myArr 和 ptr_myIntegerClass 都是指针。但是以下怎么可能是正确的:

      myArr[i] = *ptr_myIntegerClass;
    

据我所知 - 将 * 放在指针前面意味着您取消引用指针? 对?那么myArr 是一个指针如何存储这个取消引用的值呢? 或者我错了 myArr 是一个指针?但是为什么在头文件中用*声明呢?

【问题讨论】:

  • 你为什么使用namespace std
  • @jeffrey - Eclipse 自动生成这个
  • 我对此表示严重怀疑。
  • 是的。鬼能解释。但看在上帝的份上,请移除它。
  • @Jefffrey - 其他人也说过 Eclipse 会这样做。

标签: c++ arrays pointers


【解决方案1】:

星号和方括号都降低了取消引用的级别。其实myArr[i]等价于*(myArr+i)*ptr_myIntergerClass等价于ptr_myIntergerClass[0]。因此,您的分配等同于任一

*(myArr+i) = *ptr_myIntergerClass;

myArr[i] = ptr_myIntergerClass[0];

它们都是有效的,因为它们的两边都具有相同的类型(即MyIntergerClass)并且左侧是可分配的(即lvalue)。

【讨论】:

    最近更新 更多