鱼C论坛

 找回密码
 立即注册
查看: 3086|回复: 4

[已解决]C++ 自定义函数中如何传入引用型【数组】?

[复制链接]
发表于 2016-11-18 17:23:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[i];
                int j;
                for(j=i; j>0; j--)
                {                        
                        if( temp > ds[j-1] ) break;
                        ds[j] = ds[j-1];
                }
                ds[j] = temp;
        }
        
}


int main()
{
        int disorder[10] = {3,4,8,6,1,7,0,9,2,5};
        SelectSort(disorder);
                
        for(int i=0; i<10; i++)
                cout << ds[i] << " ";
        return 0;
}
最佳答案
2016-11-18 20:43:10
数组本身就是指针,也就没有引用一说。将数组直接传入函数就可以改变数组本身的内容。例如:
int a[3] = {1,2,3};
int* b = NULL;
b = a;

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-18 20:43:10 | 显示全部楼层    本楼为最佳答案   
数组本身就是指针,也就没有引用一说。将数组直接传入函数就可以改变数组本身的内容。例如:
int a[3] = {1,2,3};
int* b = NULL;
b = a;

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

评分

参与人数 1荣誉 +8 鱼币 +8 贡献 +6 收起 理由
shuofxz + 8 + 8 + 6 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-18 21:25:54 | 显示全部楼层
你 SelectSort函数的形参直接设置成数组就行了,没必要设置成数组的地址,因为数组传入函数是引用传递。通过函数会直接改变数组里的值。如果是普通变量的话就是值传递,那就要通过指针传入变量的地址,通过地址修改变量的值,所以直接改成
void  SelectSort(int ds[])或者void SelectSort(int *ds)

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
shuofxz + 2 + 2 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-18 23:49:19 | 显示全部楼层
musilintan 发表于 2016-11-18 20:43
数组本身就是指针,也就没有引用一说。将数组直接传入函数就可以改变数组本身的内容。例如:
int a[3] = { ...

讲的好透彻  例子也很棒~!  非常感谢~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢~~  我写的时候忘了数组传递也是类似指针这一回事了=。=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 15:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表