请问 处理数组的函数的形参为什么不能是引用?

xjyr 2008-03-06 06:11:21
在《C++ Primer Plus》240页说:“如果数据对象是数组,则函数的形参只能是指针,不能是引用,为什么?”
...全文
314 18 打赏 收藏 转发到动态 举报
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
vegetablebird_ 2008-03-09
  • 打赏
  • 举报
回复
所以,C++ Primer Plus中说的,似乎有点偏,要么就是译者没译好~~~~~
vegetablebird_ 2008-03-09
  • 打赏
  • 举报
回复
看C++ Primer P208,可以知道,将数组的引用形参与成int &a[10]是完全错误的,因为下标操作符的优先级非常高,只有:: . ->三者的优先级才高于[],如果写成int &a[]的形式则是表示这是个数组,它含有10个元素,全是引用类型,编译器当然会根据你传入的元素类型报错了~~~正确的写法是int (&a)[10],不过这时你必须传入大小为10的数组,不然也会错的~~~~~
比如下面的程序:
#include <iostream>
#include <cstdlib>
using namespace std;

void foo(int (&a)[10])
{
for(int i = 0; i < 9; i++)
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}

int main()
{
int arr[10];
for(int i = 0; i < 10; i++){
arr[i] = i+1;
}
foo(arr);
for(int i = 0; i < 10; i++){
cout<<arr[i]<<' ';
}
return EXIT_SUCCESS;
}
你会看到输出将是 2 3 4 5 6 7 8 9 10 1
dead_of_winter 2008-03-09
  • 打赏
  • 举报
回复
引用运行时跟指针完全等效 所以在编译期语法解析绝不允许以任何方式访问引用类型变量的实际地址 而数组是通过地址访问元素 所以既不允许"指向引用类型的指针" 也不允许"引用类型数组"
即可通过这种方式把引用转换到指针:
void fun3(int& a[10])
{
*((int*)a+3)//这个就是a[3]的实际值了
};
dead_of_winter 2008-03-09
  • 打赏
  • 举报
回复
plus的意思是数组元素的类型不能是int& 这是出于类型安全考虑
xjyr 2008-03-09
  • 打赏
  • 举报
回复
引用 10 楼 hai040 的回复:
想了一下,可能就是因为它限定了大小
多数应用数组大小都是不确定的

大小不确定的实际上传递的是指针。
比如:
void f(int m[]);
实际上等价于:
void f(int* m);

而引用不一样,数组的引用,大小必须确定。不同大小的整数数组引用,其“类型”是不一样的。
而且它跟指针的引用也不一样。
------------------------------------------
我觉得也是这样的 可以用带引用的函数处理数组 但由于引用必须制定数组大小 所以我们无法通过一个函数来处理所有的数组。如果一个函数只能处理特定大小的数组,那还要这函数做什么?

可能基于这个原因 所以处理数组的函数形参全部用引用吧!
hityct1 2008-03-08
  • 打赏
  • 举报
回复
d
晨星 2008-03-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hai040 的回复:]
想了一下,可能就是因为它限定了大小
多数应用数组大小都是不确定的
[/Quote]
大小不确定的实际上传递的是指针。
比如:
void f(int m[]);
实际上等价于:
void f(int* m);

而引用不一样,数组的引用,大小必须确定。不同大小的整数数组引用,其“类型”是不一样的。
而且它跟指针的引用也不一样。
hai040 2008-03-07
  • 打赏
  • 举报
回复
想了一下,可能就是因为它限定了大小
多数应用数组大小都是不确定的
hai040 2008-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
C/C++ code
void fun3(int (&a)[10])
{
for(int i=0; i<10; i++)
;
};
[/Quote]
这个写法还能限定数组大小,为什么这么少见到?
taodm 2008-03-07
  • 打赏
  • 举报
回复
换<C++ Primer>
数组的引用都没讲的书可以扔了.
hityct1 2008-03-07
  • 打赏
  • 举报
回复
推荐一本介绍全的c++书,我看得书好像没有讲过这个。
  • 打赏
  • 举报
回复
那个就是数组的引用写法呀。
hityct1 2008-03-07
  • 打赏
  • 举报
回复
d
hityct1 2008-03-07
  • 打赏
  • 举报
回复
楼主的问题还没解决呢。
jieao111 2008-03-06
  • 打赏
  • 举报
回复
d
hityct1 2008-03-06
  • 打赏
  • 举报
回复
看来我的理解有问题,请 akirya 解释解释。
  • 打赏
  • 举报
回复

void fun3(int (&a)[10])
{
for(int i=0; i<10; i++)
;
};
hityct1 2008-03-06
  • 打赏
  • 举报
回复

//看这个:
int arrray[10];

void fun1(int *a)//或者fun1(int a[])
{
for(int i=0; i<10; i++)
a[i]=i;
};
void fun2(int& a)//怎么实现与fun1一样的功能呢?
{
for(int i=0; i<10; i++)
;
};
//况且
//void fun3(int& a[10])//错误提示:arrays of references are illegal
//{
// for(int i=0; i<10; i++)
// ;
//};
//是不合法的

//因为如果允许arrays of references的存在,那么必需提供与指针所使用类似
//操作符++,[],则引用就会和指针一样不安全,
//而这恰恰违背了c++引入引用初衷。
相关推荐

63,596

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下