Luis Lee 2021-04-04 00:23 采纳率: 53.8%
浏览 236
已采纳

c++数组作为参数时,如何在函数里获得数组长度

 template <class T>
    int getArrayLen(T& array) 
    //不能获取指针数组的长度
    {
        return (sizeof(array) / sizeof(array[0]));
    }

代码如上图,当执行下列代码:

binode<int>l[6]={a,b,c,d,e,f};
cout<<getArrayLen(l)<<endl;

结果为:

6
Program ended with exit code: 0

当执行下列代码:

    binode<int>*t=l;
    cout<<getArrayLen(t)<<endl;

输出的结果为:

0
Program ended with exit code: 0

这个错误我感觉是这样,一旦数组的指针的地址被拷贝给了另一个地址,编译器(准确的说是sizeof)就不知道他是一个数组,size

of只会返回这个地址表示的内容的大小.

这个代码知识一小部分,完整的题目是这样的,已知某个二叉树的中序和先序遍历(两个链式存储方式的数组)设计算法,设计算法构建这个二叉树并求出他的层次遍历的序列.

#ifndef Tree_h
#define Tree_h
#include <iostream>
#include<stack>
#include<queue>
#include <list>
namespace MyTest{
using namespace std;
   
//the link-storage for binarytree
    template <class T>class binode {
private:
    binode* lchild;
    binode* rchild;
    T data=NULL;
    
public:
    //conduct function
    binode(T d=NULL,binode* l=NULL,binode* r=NULL):data(d),lchild(l),rchild(r)
    {
        //cout<<"conduct successfully!"<<endl;
    }
    binode* getleft(){return lchild;}
    binode* getright(){return rchild;}
    void setleft(binode*l){lchild=l;}
    void setright(binode*r){rchild=r;}
        void setdata(T d){data=d;}
    T getdata(){return data;}
    //Preorder function
    void preorder(){
        //if (data!=NULL)
        if(this!=NULL)
        {
            cout<<data<<endl;
            lchild->preorder();
            rchild->preorder();
        }else{
            return;
        }
    }
       //Inorder function
    void inorder(){
        if(this!=NULL)
        {
            lchild->inorder();
            cout<<data<<endl;
            rchild->inorder();
        }
    }
     //Postorder function
    void postorder(){
        if(this!=NULL)
        {
            lchild->postorder();
            rchild->postorder();
            cout<<data<<endl;
        }
    }
    //Levelorder function
    void levelorder(){
        queue<void*> q;
        q.push(this);
        while(!q.empty()){
            cout<< ((binode*)q.front())->data <<endl;
            if(((binode*)q.front())->getleft()!=NULL)
            q.push(((binode*)q.front())->getleft());
            if(((binode*)q.front())->getright()!=NULL)
            q.push(((binode*)q.front())->getright());
            q.pop() ;
        }
    }
        bool operator==(binode p){
            if(this->data==p.getdata()&&this->lchild==p.getleft()&&this->rchild==p.getright()){
                return true;
            }else{
                return false;
            }
        }
};
    template <class T>
    int getArrayLen(T& array)
    //不能获取指针数组的长度
    {
        return (sizeof(array) / sizeof(array[0]));
    }
    //截取数组
    template <typename i>
    i* concat(i* p,int pri,int be){
        i* q=new i[be-pri+1];
        int k=0;
        int j=pri;
        for(;j<=be;j++){
            q[k]=p[j];
            k++;
        }
        return q;
    }
    template <typename H>
    binode<H>* CreateBinTree(binode<H> pre[],binode<H> ino[]){
        if(getArrayLen(ino)==1){
            return ino;
        }
        for(int i=0;i<getArrayLen(pre);i++){//在先序序列中获取一个根
            for(int j=0;getArrayLen(ino);j++){//在中序中找到这个根的位置,他右边是他的左子树序列,左边是右子树序列
                if((ino[j]==pre[i])){
                    ino[j].setleft(CreateBinTree(concat(pre,i+1,getArrayLen(pre)-1),concat(ino,i,j-1)));//对左子序列递归执行
                    ino[j].setright(CreateBinTree(concat(pre,i+1, getArrayLen(pre)-1),concat(ino,j-1,getArrayLen(ino)-1)));//对右子序列递归执行
                    break;
                }
            }
        }
    }
}
#endif /* Tree_h */

这部分代码除了这部分有问题以外,其他遍历代码,数组截取代码都没有问题.

解决方案中不要使用标准容器类或者库方法,最好有一些讲解,代码结构上可能有很多不规范的地方请多多包涵,谢谢.

  • 写回答

3条回答 默认 最新

  • lemon-l 2021-04-04 00:52
    关注

    你可以参考字符串的做法,在末尾元素设一个特殊的值,代表结束,字符串的终止值就是‘\0’,或者用类似于STL,传一个begin迭代器和end迭代器,end-begin就等于容器大小

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格