You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过指针而非下标访问类的数组类型成员属性?

问题分析与解决方案

你的代码存在几个编译错误和逻辑问题,导致无法得到预期结果,以下是具体问题和修正方案:

核心问题

  1. 类成员访问权限限制:C++中类的成员默认是private权限,外部无法直接访问fooArray,myFoo.fooArray这种写法会编译失败。
  2. 数组赋值语法错误:数组名是常量指针,不能直接用=进行赋值,myFoo.fooArray = {1,2,...};是非法语法。
  3. main函数语法错误:main函数需要写成int main(),必须有括号和返回值类型。

修正方案

方案一:公开数组成员(直接满足指针操作需求)

将fooArray改为public权限,同时用列表初始化正确初始化对象:

class foo {
public: // 修改为public权限,允许外部访问数组
    int fooArray[10];

    int multiplyFirstAndSecondElement() {
        return *(fooArray) * *(fooArray + 1);
    }
};

int main() {
    // 用列表初始化对象,直接初始化内部数组(C++11及以上支持)
    foo myFoo{{1,2,3,4,5,6,7,8,9,10}};
    // 外部通过指针访问数组元素,逻辑与类内完全一致
    int result = *(myFoo.fooArray) * *(myFoo.fooArray + 1);
    int resultInternal = myFoo.multiplyFirstAndSecondElement();
    // 此时result和resultInternal的值均为2
}

方案二:保持封装性,提供指针访问接口

如果不想公开数组成员,可添加一个返回数组指针的成员函数,兼顾封装性和指针操作需求:

class foo {
private:
    int fooArray[10];

public:
    // 构造函数:通过传入数组初始化内部fooArray
    foo(const int initArr[10]) {
        for (int i = 0; i < 10; ++i) {
            fooArray[i] = initArr[i];
        }
    }

    int multiplyFirstAndSecondElement() {
        return *(fooArray) * *(fooArray + 1);
    }

    // 返回数组首元素的指针,允许外部用指针操作数组
    int* getFooArray() {
        return fooArray;
    }
};

int main() {
    int initArr[] = {1,2,3,4,5,6,7,8,9,10};
    foo myFoo(initArr);
    // 获取数组指针
    int* arrPtr = myFoo.getFooArray();
    // 用指针计算结果
    int result = *arrPtr * *(arrPtr + 1);
    int resultInternal = myFoo.multiplyFirstAndSecondElement();
    // 两者结果均为2
}

说明

两种方案中,外部指针访问数组的逻辑和类内部multiplyFirstAndSecondElement的逻辑完全一致:*arrPtr等价于fooArray[0],*(arrPtr+1)等价于fooArray[1],因此计算结果必然相同。

内容的提问来源于stack exchange,提问作者L. Merbecks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:42:43