shuofxz 发表于 2016-11-18 17:23:07

C++ 自定义函数中如何传入引用型【数组】?

本帖最后由 shuofxz 于 2016-11-18 23:52 编辑

下面的代码就是一个直接插入排序的程序,我想做的是通过SelectSort这个函数,将disorder这个数组中的数据进行排序。为了使函数调用后,原来的数组也能跟着变化,所以SelectSort传入的参数用了,引用数据类型,但是在编译的时候这里void SelectSort(int[] &ds)报错了。
问下数组的引用类型是不能这么写,还是哪里写的有问题?

#include <iostream>
using namespace std;

void SelectSort(int[] &ds)
{
        int temp;
        for(int i=1; i<10; i++)
        {
                temp = ds;
                int j;
                for(j=i; j>0; j--)
                {                       
                        if( temp > ds ) break;
                        ds = ds;
                }
                ds = temp;
        }
       
}


int main()
{
        int disorder = {3,4,8,6,1,7,0,9,2,5};
        SelectSort(disorder);
               
        for(int i=0; i<10; i++)
                cout << ds << " ";
        return 0;
}

musilintan 发表于 2016-11-18 20:43:10

数组本身就是指针,也就没有引用一说。将数组直接传入函数就可以改变数组本身的内容。例如:
int a = {1,2,3};
int* b = NULL;
b = a;

以上的语法你应该见到过,为什么数组不需要取地址就直接可以传递给指针?因为数组本身就和指针没多大区别。看一下下面的用法:
a 为 2
*(b+1) 的值 也是2
这个语法应该也了解吧,而且,*(b+1)是可以直接写成b的。这样同样可以取到第二个元素的值。
从上面可以看出,数组本身就相当于一个指针。也就是说,你将数组传入函数,实际上传入的是头指针的值,数组的内存地址没有改变过。所以,你在函数内部直接修改传入的数组,就相当于在修改原来的数组。所以,C++数组是没有引用一说的。
引用只是存在于那些实体变量身上的。像int、char、class啊什么的,这些家伙都是实体,传入函数的时候会出现拷贝的情况。他们传入函数都是将自己拷贝给参数,参数本身就是独立的实体。所以你在函数里面改参数,压根就和外面的原始变量没关系。但是,指针就不一样了。虽然指针本身传入函数同样是参数拷贝。但是,我们在函数里面改的是指针所指空间的内容,并不是指针本身。如果你尝试修改参数指针本身,同样不会影响到外面的原始指针。但如果你要修改指针指向的空间,那么外面的也同样会变,因为外面的指针也是指向那块内存。两人都指向同一个地方,那个地方变了,两人肯定都会变。
举一个简单的例子:
比如有2个人被关在了两个黑屋子,现在2个人可以公用一个本子,一个人在上面画一只猫,那另一个人当然也会知道本子上被面画了一只猫,因为这个本子是两人公用的,只是这个人并不知道是谁画的。只知道有人画了一只猫上去。
    这就像两个指针都指向一个内存空间一样。一个指针改了内存空间,那另一个指针也会知道。
而引用是什么原理?就好比你们班上有个叫张三的人。他有个外号就张屌丝。你突然想让张三给你带早点,为了客气点你会说:张三给我带个早点。然后张三肯定知道你是在让他给你带早点,于是他买早点的时候给你带一份。又比方说张三欠了你的钱,你要钱的时候可能会说:张屌丝赶紧还钱啦。这时候张三肯定也知道你在说他。。于是他拒绝了你。。。
    这就好比引用,一个变量。以引用方式带入函数时,就像是告诉函数这个变量的小名。不敢函数干啥,直接叫张屌丝就好,张三肯定知道这是在叫自己。
    理解这两个东西的原理,你就知道你的问题在哪了,简单调试一下,分分钟搞定。

我叫淳子 发表于 2016-11-18 21:25:54

你 SelectSort函数的形参直接设置成数组就行了,没必要设置成数组的地址,因为数组传入函数是引用传递。通过函数会直接改变数组里的值。如果是普通变量的话就是值传递,那就要通过指针传入变量的地址,通过地址修改变量的值,所以直接改成
voidSelectSort(int ds[])或者void SelectSort(int *ds)

shuofxz 发表于 2016-11-18 23:49:19

musilintan 发表于 2016-11-18 20:43
数组本身就是指针,也就没有引用一说。将数组直接传入函数就可以改变数组本身的内容。例如:
int a = { ...

讲的好透彻{:10_275:}例子也很棒~!非常感谢~~~

shuofxz 发表于 2016-11-18 23:51:24

我叫淳子 发表于 2016-11-18 21:25
你 SelectSort函数的形参直接设置成数组就行了,没必要设置成数组的地址,因为数组传入函数是引用传递。通 ...

非常感谢~~我写的时候忘了数组传递也是类似指针这一回事了=。=
页: [1]
查看完整版本: C++ 自定义函数中如何传入引用型【数组】?