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

请教Employee类指针数组的正确写法及禁用某写法的原因

关于Employee指针数组的成员访问写法问题

作为指针新手,咱们先把核心逻辑掰明白:你创建的是Employee指针数组,数组里的每一个元素都是Employee*类型(指向Employee对象的指针),不是Employee对象本身——这就是两种写法对错的根源。

先还原常见的错误场景(你的第一种写法)

假设你原来的代码是这样的:

Employee* empArray[5]; // 定义一个能存5个Employee指针的数组
for (int i = 0; i < 5; i++) {
    // 错误:直接对指针用点运算符
    empArray[i].setName("John"); 
}

这种写法为什么不行?因为empArray[i]是一个Employee*指针,而.(点运算符)是用来访问对象或结构体实例的成员的,不能直接用在指针上。编译器会报错,因为它找不到指针类型Employee*里的setName成员——指针本身没有这个成员,它指向的对象才有。

正确的两种写法(包括别人说的“点式写法”)

别人建议的点式写法,其实是先把指针解引用成对象,再用点运算符访问成员,代码是这样的:

for (int i = 0; i < 5; i++) {
    // 先解引用指针(*empArray[i]得到指针指向的Employee对象),再用点运算符
    (*empArray[i]).setName("John"); 
}

这完全正确,因为*empArray[i]拿到的是指针指向的真实Employee对象,用点运算符访问成员是符合语法的。

另外还有一种更常用的简写方式,就是用->(箭头运算符),它本质上是(*指针).成员的语法糖,代码更简洁:

for (int i = 0; i < 5; i++) {
    // 箭头运算符直接用于指针,等价于(*empArray[i]).setName(...)
    empArray[i]->setName("John"); 
}

这两种写法都是正确的,别人说的“点式写法”就是第一种解引用后用点的方式。

额外提醒:别忘给指针分配对象

最后要注意,你定义的指针数组只是存了指针的位置,这些指针一开始都是野指针(指向随机内存),必须先让它们指向有效的Employee对象才能访问成员,比如:

for (int i = 0; i < 5; i++) {
    // 先动态分配一个Employee对象,让指针指向它
    empArray[i] = new Employee();
    // 再访问成员
    empArray[i]->setName("John");
}

不然会触发未定义行为,程序崩溃或者出现奇怪的结果。

内容的提问来源于stack exchange,提问作者Kreetchy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:38:28