有关C++参数传值的一个问题探讨

今天看系统程序设计的时候看到一个程序,思来想去感觉最后的结果跟自己想的不太一样.后来终于弄明白了,现在贴上:

#include <stdio.h>

void Initialize (char * a, char * b)
{
        a[0] = 'T'; a[1] = 'h'; a[2] = 'i';
        a[3] = 's'; a[4] = ' '; a[5] = 'i';
        a[6] = 's'; a[7] = ' '; a[8] = 'A';
        a[9] = '\0';
        b = a;
        b[8] = 'B';
}

#define ARRAY_SIZE 10
char a[ARRAY_SIZE];
char b[ARRAY_SIZE];

int main(int argc, char * argv[])
{
        Initialize(a, b);
        printf("%s\n%s\n", a, b);
        return 0;
}
源程序就是这个样子的,那么输出结果是this is B,但是b数组打印出来却是空的.是这样的,在我的印象中,凡是涉及到地址操作的,那肯定改变的就是对象本身而不是对象的一个复制品,所以这里我很不可思议,到底是哪里想错了呢?ab数组初始时都是空的,这肯定是没有问题的,可是既然b被赋值为a,那么ab现在的地址都是一样的,那么对b的操作肯定也是对a的操作,而且最后打印出来的应该是一样的,为什么b是空的呢?


原来,这个函数传递进去的参数是一个基础类型指针类型,那么其实传递到函数栈中的是ab数组首地址的一个复制品,那么在函数体中其实都是些临时变量.b=a是将b数组首地址的一个复制的临时变量赋值为a数组的首地址的一个复制的临时变量.这个时候对b进行操作,其实是对a数组进行操作,但是b数组的实际首地址是没有发生任何变化的,因为穿进去的只是b数组的一个复制品,所以当程序从这个函数体中推出的时候,b数组的首地址还是原来的首地址,那么它之后的内存单元中的值当然是没有发生任何变化的,都是被值为零的.

但是这个程序的用意明显是对ab数组同时进行初始化,那么这个该怎么做呢?当然是进行深复制.也就是说我们不能改变数组的首地址,而是直接根据复制的临时中间变量来对数组单元进行操作,从而改变数组中的内容.改写后的程序如下所示:

void Initialize (char * a, char * b)
{
        int i;
        a[0] = 'T'; a[1] = 'h'; a[2] = 'i';
        a[3] = 's'; a[4] = ' '; a[5] = 'i';
        a[6] = 's'; a[7] = ' '; a[8] = 'A';
        a[9] = '\0';
        for (i = 0; i < ARRAY_SIZE; i++) 
        {
            b[i] = a[i];
        }
        b[8] = 'B';
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值