C++ 数组的引用做函数参数怎么写?

rickys2080 2013-01-31 06:32:37

#include <iostream>
using namespace std;

void fun(char (&buff)[11])//括号里必须有11才不报错
{
cout<< buff;
}

int main(int argc, char *argv[])
{
char buff[] = "helloworld";
fun(buff);
return 0;
}


#include <iostream>
using namespace std;

void fun(char (&buff)[])//这样写报错,why? 写成void fun(char &buff[])也报错
{
cout<< buff;
}

int main(int argc, char *argv[])
{
char buff[] = "helloworld";
fun(buff);
return 0;
}

C++ 数组的引用做函数参数怎么写?
...全文
9449 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
billzheng 2013-02-21
  • 打赏
  • 举报
回复
Because in C++, array decays to pointer You could either pass a pointer to function
void fun(char *)
OR
template<int N>
void fun(char (&buff)[N])
{
    // array size is N
}
无猫皆笼 2013-02-21
  • 打赏
  • 举报
回复
9楼正解,学习~
麻浦区保安 2013-02-21
  • 打赏
  • 举报
回复
嗯 9楼正解!!
rickys2080 2013-02-01
  • 打赏
  • 举报
回复
引用 9 楼 rocktyt2 的回复:
引用 1 楼 ZLhy_ 的回复:void fun(char (&amp;buff)[11])//括号里必须有11才不报错 { cout<< buff; } 在你这个函数里面用到的是一维数组指针的引用,这样子必须指明数组的长度。其实数组名在作为函数参数传递的时候被弱化为指针了,所以你完全可以在参数传递的时候把数组名看作是指针来传递,比如: voi……
路上两位靠谱
leolee82 2013-02-01
  • 打赏
  • 举报
回复
template<int n> void fun(char (&buff)[n]) {cout<< buff;} 楼上正解 VC函数库中就有许多地方用了这种方法
rocktyt 2013-02-01
  • 打赏
  • 举报
回复
引用 1 楼 ZLhy_ 的回复:
void fun(char (&buff)[11])//括号里必须有11才不报错 { cout<< buff; } 在你这个函数里面用到的是一维数组指针的引用,这样子必须指明数组的长度。其实数组名在作为函数参数传递的时候被弱化为指针了,所以你完全可以在参数传递的时候把数组名看作是指针来传递,比如: void fun(char *&buff……
void fun(char (&buff)[11])跟void fun(char *&buff);完全是两回事,lz不要听他的 c++的数组类型是带有长度信息的,引用传递时如果指明是数组则必须指定长度,char[]这种是不完全类型,在没有别的条件来确定长度的情况下是不能当做一个类型来使用的 如果lz想接收任意长度的数组,应当使用模板函数

template<size_t size>
void fun(char (&buff)[size])
{
    cout<< buff;
}
rickys2080 2013-02-01
  • 打赏
  • 举报
回复
楼上两位靠谱
youyou1912 2013-01-31
  • 打赏
  • 举报
回复
C++数组作为引用, 一定是要写出这个数组的大小的, 因为不同于指针, 数组是带大小信息的. char arr[10]; arr 为指针 &arr 为数组的指针, 两者性质不一样. 参见C++ Primer
youyou1912 2013-01-31
  • 打赏
  • 举报
回复
你第一个不就是你要的答案么.... 指针的如下. 一定要把参数名用() 括起来, 否则会视为指针.

void fun(char (&buff)[11])//括号里必须有11才不报错
{
    cout<< buff << endl;
}
 void fun2(char (*buff)[11])//括号里必须有11才不报错
{
    cout<< *buff << endl;
}
 

int _tmain()
{
    char buff[] = "helloworld";
    fun(buff);
    fun2(&buff);
    return 0;
}
rickys2080 2013-01-31
  • 打赏
  • 举报
回复
rxin423355541 2013-01-31
  • 打赏
  • 举报
回复
char buff[] 感觉这样buff只是一个伪指针,其地址不占用栈空间,所以编译器不让你引用
疯狂的红豆 2013-01-31
  • 打赏
  • 举报
回复
引用 2 楼 syrchina 的回复:
引用 1 楼 ZLhy_ 的回复:void fun(char (&amp;buff)[11])//括号里必须有11才不报错 { cout<< buff; } 在你这个函数里面用到的是一维数组指针的引用,这样子必须指明数组的长度。其实数组名在作为函数参数传递的时候被弱化为指针了,所以你完全可以在参数传递的时候把数组名看作是指针来传递,比如: voi……
我用的VS2010编译了,可以的。至于你的错误,我还没见过呢,一起坐等大神吧
rickys2080 2013-01-31
  • 打赏
  • 举报
回复
在线等C++大神解释
rickys2080 2013-01-31
  • 打赏
  • 举报
回复
引用 1 楼 ZLhy_ 的回复:
void fun(char (&buff)[11])//括号里必须有11才不报错 { cout<< buff; } 在你这个函数里面用到的是一维数组指针的引用,这样子必须指明数组的长度。其实数组名在作为函数参数传递的时候被弱化为指针了,所以你完全可以在参数传递的时候把数组名看作是指针来传递,比如: void fun(char *&buff……
你运行过吗? 我在mingw运行报错: error: invalid initialization of non-const reference of type 'char*&' from a temporary of type 'char*'

#include <iostream>
using namespace std;

void fun(char *&buff)//写成这样也有问题? 
{
	cout<< buff;
}

int main(int argc, char *argv[])
{
	char buff[] = "helloworld";
	//fun(buff);//error: invalid initialization of non-const reference of type 'char*&' from a temporary of type 'char*'
	char *p = buff;
	fun(p);//运行正确
	 
	return 0;
}
疯狂的红豆 2013-01-31
  • 打赏
  • 举报
回复
void fun(char (&buff)[11])//括号里必须有11才不报错 { cout<< buff; } 在你这个函数里面用到的是一维数组指针的引用,这样子必须指明数组的长度。其实数组名在作为函数参数传递的时候被弱化为指针了,所以你完全可以在参数传递的时候把数组名看作是指针来传递,比如: void fun(char *&buff);一个道理,都是对指针的引用传递

65,176

社区成员

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

试试用AI创作助手写篇文章吧