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++ 数组的引用做函数参数怎么写?
...全文
9485 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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);一个道理,都是对指针的引用传递
内容概要:本文档介绍了基于RESTful设计的高性能API接口的实战开发案例,涵盖从设计、开发、权限控制、性能优化到测试与文档自动化等环节。项目以用户管理与权限控制系统为例,采用Node.js + Express.js作为后端框架,MongoDB为数据库,Mongoose管理数据模型,严格遵循RESTful风格的接口设计,定义了标准HTTP动作对应的操作。安全性方面,实现了JWT认证机制和基于角色的访问控制(RBAC),确保接口安全。性能优化措施包括Redis缓存热点数据、接口请求频率限制、Winston和Morgan日志系统。开发调试借助Postman和Swagger UI,支持自动生成接口文档,提高前后端协作效率。部署方案利用Docker、Nginx、GitHub Actions等技术实现自动化部署,ELK用于日志收集与分析。; 适合人群:有一定编程基础,尤其是对API开发感兴趣的开发者和系统架构师。; 使用场景及目标:①学习RESTful风格的API设计原则;②掌握API的安全机制,如JWT认证和RBAC;③了解性能优化方法,如缓存和限流;④熟悉API开发的完整流程,包括测试、文档管理和部署。; 阅读建议:本案例详细描述了API开发的各个环节,建议读者按照文档顺序逐步学习,重点理解各部分的技术细节和实现原理,同时结合实际项目进行实践。
内容概要:本文详细解析了2025年全国大学生电子设计大赛D题——声音定位系统,从赛题要求、系统架构、硬件选型、算法选择到软件代码实现进行了全面阐述。赛题要求设计一个声音定位系统,包括声响模块、声音接收模块和信息处理模块。声响模块负责产生500Hz的声音信号,声音接收模块通过麦克风和放大电路接收声音信号,信息处理模块则根据声音传播的时间差计算声响模块的位置坐标,并显示出来。发挥部分还包括提高定位精度、连续跟踪显示坐标值和显示移动轨迹。文中还介绍了开发环境搭建、关键代码实现以及常见问题的解决方法。 适合人群:具备一定电子设计基础的大学生、电子设计爱好者和参赛选手。 使用场景及目标:①帮助参赛者理解赛题要求,掌握声音定位系统的设计和实现方法;②提升参赛者的电子设计能力和编程水平,为比赛好准备;③通过实际项目锻炼创新思维和实践能力,积累宝贵的经验。 其他说明:本文不仅涵盖了硬件选型、电路设计、算法选择等技术细节,还提供了详细的代码实现和优化建议,有助于读者全面掌握声音定位系统的开发过程。此外,文章还强调了电子设计竞赛的重要性,鼓励读者积极参与,探索电子设计的无限可能。

65,194

社区成员

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

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