关于C++的指针数组
PHP中文网
PHP中文网 2017-04-17 10:59:45
[C++讨论组]

在头文件定义的某结构中包含Obj *p这个属性
但是这个属性在实现中其实是malloc了一个指针数组,但是如果头文件里没有注释说明这个*p是一个指针数组,是不是不看代码就没法知道Obj *p其实是数组了?

看了一些代码头文件中明明是Obj *p,使用的时候却p[i]这样用,翻了cpp文件才发现原来是malloc数组了,
这样的代码的歧义也太大了,难道大家一直都这么用的?难道C++这个平行世界这么神奇?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
高洛峰

Obj *p;
p只是一个指向Obj结构或类型的指针。
malloc向系统申请一块内存,成功的话就返回一个地址,在楼主看的代码里应该把这个地址赋给p了。
由于声明的是Obj指针类型,编译器就将这块内存里的内容解释为Obj结构或类型的一个实例(或者说变量)。
p[i]会被编译器翻译成*(p+i), 由于p是Obj类型的,这个表达式表示的就是从p 开始,第i个Obj对象。

天蓬老师

我也想说说自己的看法,首先我不知道这个结构会是多大,如果很小的话,要表达结构中包含这个实例变量,我会这样定义一个结构
struct SomeData {
...
Obj _obj;
};
如果结构要包含的是一个元素类型为Obj的数组,但是数组元素个数未可知,那我当然是像使用问题中的指针存放动态数组的首元素地址的方法了。
struct SomeData {
...

  1. Obj _pObj;

};
-----------------------
不过,我不明白C++中为什么要用指针表示未知数组呢,何不用vector呢
---------------------------
题主有注意过结构的构造函数和析构函数吗?
我猜测应该是这样的:
SomeData::SomeData()
{
_pObj = (Obj*)malloc(sizeof(Obj)*someInt);
}
SomeData::~SomeData()
{
free(_pObj);
}
malloc和free应该搭配使用的,delete和new是搭配使用的,但是new一个数组的时候语法和malloc是不同的,而它的delete也加上了[]符号。设想未知到_pObj是“new”的结果的时候,析构函数不知道该调用delete还是delete[]释放_pObj指向的内存。

阿神

指针实际上指向的是一块内存区域,Obj类型的指针表示它指向的那块内存至少有sizeof(Obj)那么大,至于这块内存有多少个Obj,单从指针来看,是没法知道的。
PS:建议使用vector之类的容器而不是用数组。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号