关于C++结构体的函数调用

在一段利(没)用(事)链(找)表(事)来实现正整数相加的程序中,有一个函数是这样的,实现了将位数较小的链表最高位加到位数较大的链表上的功能。

void addMostDigit(List addee, List adder){//addee的位数不小于adder
    int index = addee.size() – adder.size();
    int sum = addee.get(index)->digit + adder.header->digit;
    adder.header = adder.header->next;
 
    if (sum < 10)
    {
        addee.get(index)->digit = sum;
        return;
    }
 
    while (sum >= 10){
        addee.get(index)->digit = sum % 10;
 
        if (index == 0)//需要变动最高位
        {
            Node* newHead = new Node(‘1’);
            newHead->next = addee.header;
            addee.header = newHead;
            break;
        }
 
        sum = addee.get(–index)->digit + sum / 10;
        if (sum < 10)
        {
            addee.get(index)->digit = sum;
            break;
        }
    }
}

错误是很简单的,此处传递的List应该是List*,而非List;这一点相信在交换两个整数值的函数中就已明确。我犯错的原因,大概是不知不觉间又用了java的思维——一切都是引用变量。

 

解决方案很简单,该用地址传递即可。

void addMostDigit(List* addee, List* adder){
    int index = addee->size() – adder->size();
    int sum = addee->get(index)->digit + adder->header->digit;
    adder->header = adder->header->next;
    
    if (sum < 10)
    {
        addee->get(index)->digit = sum;
        return;
    }
    
    while (sum >= 10){
        addee->get(index)->digit = sum % 10;
        
        if (index == 0)
        {
            Node* newHead = new Node(‘1’);
            newHead->next = addee->header;
            addee->header = newHead;
            break;
        }
        
        sum = addee->get(–index)->digit + sum / 10;
        if (sum < 10)
        {
            addee->get(index)->digit = sum;
            break;
        }
    }
}

从这个角度讲,java的原点运算符实际上等价于C++的->,而java编程时的规则,不过是C++可遵守的诸多规则之一而已。

换而言之,在栈帧的调用时,准备的入口参数中,真的包含了List这个struct的实体。那么,如果struct很大的话,这样的函数调用岂不是花费巨大?如果这样,那么全部用指针或引用(引用更安全一些),或许会是一种很好的编程方法。

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?