数组作为函数参数传递
数组作为函数参数传递的时候,会退化为指针,并不能得到数组的大小
一
void test1(int a[])
{
cout << sizeof(a) << endl;
}
int main() {
int a[4];
test1(a);
}
输出结果是指针的大小,并不是数组的大小
二
void test2(int a[4])
{
cout << sizeof(a) << endl;
}
int main() {
int a[4];
test2(a);
}
这种情况,也是指针,虽然声明了是数组,但是由于值传递,还是先把a转成了指针,又传递的。
三
void test4(int(&a)[4])
{
cout << sizeof(a) << endl;
}
int main() {
int a[4];
test4(a);
}
这种是传递一个数组的引用,是可以的,但是限定了数组的大小。
四
模板
template<size_t size>
void test5(int (&a)[size])
{
cout << sizeof(a) << endl;
}
template<class T, size_t size>
void test6(T (&a)[size])
{
cout << sizeof(a) << endl;
}
模板是可以获得大小的,并且是作为数组传递,要注意的是必须是数组的引用,如果直接是void test(T a[size])
,模板是没有问题,但是传递数组的时候,模板无法展开,类型对应不上。
注意
为什么数组的引用是int (&a)[size],而不是int & a[size]呢?因为根据优先级组合规则,后面的会被认为是(int&)a[size]引用的数组,这个是非法的,所以需要括号明确a的类型为引用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏