马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
数组本身就是指针,也就没有引用一说。将数组直接传入函数就可以改变数组本身的内容。例如:
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个人可以公用一个本子,一个人在上面画一只猫,那另一个人当然也会知道本子上被面画了一只猫,因为这个本子是两人公用的,只是这个人并不知道是谁画的。只知道有人画了一只猫上去。
这就像两个指针都指向一个内存空间一样。一个指针改了内存空间,那另一个指针也会知道。
而引用是什么原理?就好比你们班上有个叫张三的人。他有个外号就张屌丝。你突然想让张三给你带早点,为了客气点你会说:张三给我带个早点。然后张三肯定知道你是在让他给你带早点,于是他买早点的时候给你带一份。又比方说张三欠了你的钱,你要钱的时候可能会说:张屌丝赶紧还钱啦。这时候张三肯定也知道你在说他。。于是他拒绝了你。。。
这就好比引用,一个变量。以引用方式带入函数时,就像是告诉函数这个变量的小名。不敢函数干啥,直接叫张屌丝就好,张三肯定知道这是在叫自己。
理解这两个东西的原理,你就知道你的问题在哪了,简单调试一下,分分钟搞定。
|