函数参数为指针数组的问题。

poppopa 2014-09-23 11:30:02
下面这个程序的计算结果是错误的,我想计算两个图形的面积之和(通过totalArea()这个函数),但是结果只是计算了一个的面积。
问题1:为什么在totalArea()里面调用getArraylen()计算指针数组的长度返回为1呢?(我期望是2)
问题2:调试的时候,为什么在totalArea()里面的sharp的数据类型变成了 Tsharp**?(我期望是Tshap*[2],和实参s一样)。

我有点乱。。。求教各位了


#include <iostream>
#include <string>
using namespace std;
//基类
class Tsharp
{
protected:
int height,width;
public:
Tsharp(const int h=0,const int w=0){height=h;width=w;};
virtual float area() = 0; //纯虚函数
};

//三角形类
class Ttriangle : public Tsharp
{
public:
Ttriangle(const int h,const int w):Tsharp(h,w){};
virtual float area(){return 0.5*height*width;};
};

//矩形类
class Trectangle : public Tsharp
{
public:
Trectangle(const int h,const int w):Tsharp(h,w){};
virtual float area(){return height*width;};
};

//计算数组长度的函数模板
template<typename T>
int getArrayLen(T &arr)
{
if(sizeof(arr) == 0)
return 0;

return sizeof(arr)/sizeof(arr[0]);
}

float totalArea(Tsharp *sharp[])
{
cout << *sharp << ".......*sharp" << endl;
cout << &sharp << ".......&sharp" << endl;
cout << sharp << ".........sharp" << endl << endl;
int arrayLength = getArrayLen(sharp);
float sum = 0;
for(int i = 0; i<arrayLength ; i++)
sum += sharp[i]->area();

return sum;
}

int main()
{
Tsharp *t1,*t2;
Trectangle rec(3,5);
Ttriangle tri(3,5);
t1 = &rec;
t2 = &tri;
cout << "长方形(3,5)面积: " << t1->area() << endl;
cout << "三角形(3,5)面积: " << t2->area() << endl;

cout << "--------------------------------\n";




Tsharp *s[2];

//cout << &s[1] << endl;
s[0] = &rec;
s[1] = &tri;

cout << s << ",,,,,,,,,s"<<endl;
cout << &s << ".........&s" << endl << endl;

cout << *s << "..........*s" << endl;
cout << s[0] << "........s[0]" << endl;
cout << &rec << ".........&rec" << endl << endl;


cout << "面积之和:" << totalArea(s) << endl;



getchar();
return 0;
}
...全文
152 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2014-09-23
  • 打赏
  • 举报
回复
数组做形参跟指针是一样的,所以不能在里边计算数组的长度,需要外部传入长度信息
vcgaoshou 2014-09-23
  • 打赏
  • 举报
回复
同意楼主的意见,数组作为函数的参数时,传递的是数组的首元素的地址,在函数中,是无法通过该地址获取其实际的长度的
蜗牛sf 2014-09-23
  • 打赏
  • 举报
回复
做参数传递只是单纯的指针,应该把大小一起传过来
熊熊大叔 2014-09-23
  • 打赏
  • 举报
回复
数组做函数参数使用时,与指针等价。因此sizeof(sharp) = sizeof(Tsharp **), 数组的大小不会跟着传入。你必须在函数接口中增加一个参数,手工将数组大小传入。 你可以这样理解,你把数组传入参数时,只是把数组起始地址的指针压倒了栈里,因此从栈里是读不出数组大小的。 对于定义一个数组直接使用的情况,编译器是知道数组大小的;但是数组做参数时,这个被调函数可能被多个函数调用,每个函数传入的数组大小都不一样,编译器也就没法确定数组大小了。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧