C/C++传入数组及怎样限定传入数组的大小
来源:互联网 发布:淘宝客服服务流程 编辑:程序博客网 时间:2024/06/08 15:06
很多人c和c++的初学者都知道这样一个事实:数组不能直接作为函数的形参,当传入一个数组名时,数组会退化为对应的指针类型。
例如考虑如下函数:
void chuanrushuzu(int a[10]){ return;//没有实质内容,只是为了说明数组的传入}
这里函数的形参虽然指定了数组的大小,但实质上编译器是不认的,在编译器眼中,被传入的只是一个int*类型的指针,也就是说,在此例的函数中,int a[10]等价于int* a,你传入的数组名无论其实际大小是多少,只要类型正确,都能通过编译。
那是不是就没有办法限定传入数组的大小了呢,方法是有的!
那就是利用指针(c/c++)或引用。
下面举一个利用引用的例子:
#include<iostream>using namespace std;void dingchangshuzu(int (&p)[10]){ cout<<"传入了定长数组"<<endl;}int main(){ int p1[5]={}; int p2[10]={}; int p3[15]={}; int* p4=new int[15](); dingchangshuzu(p1);//error C2664: “dingchangshuzu”: 不能将参数 1 从“int [5]”转换为“int (&)[10]” dingchangshuzu(p2);//通过 dingchangshuzu(p3);//error C2664:不能将参数 1 从“int [15]”转换为“int (&)[10]” dingchangshuzu(p4);//error C2664:不能将参数 1 从“int *”转换为“int (&)[10]” return 0;}
这里,int (&p)[10]定义了一个含有10个元素的数组的引用,引用在形参表中不会退化,因此当传入大小不一致的数组时,编译不能通过。
利用指针的例子也类似
只要把int (&p)[10]替换成int (*p)[10],传入数组名的时候对数组名取地址(形如&p1)即可,留给感兴趣的读者自己尝试,由于c语言不支持引用,所以这种方式可以用作c环境下的编程。
总结一下,C/C++之所以不支持定长数组的直接传入,是因为数组名在传入形参时会进行一次退化,那既然这样,我们的应对方式就是绕过这次退化,传入数组名的引用或指向数组名的指针。
1 0
- C/C++传入数组及怎样限定传入数组的大小
- Ndk学习之JNI传入数组(java-->C)
- c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)
- C的可变参数传入
- 如何定义宏,返回数组的大小,并可以检查传入的参数是否为数组
- Ibatis传入数组参数
- java数组传入oracle
- 函数传入数组长度
- 传入动态数组
- 数组 传入 函数
- beego 传入String[],beego传入数组
- ibatis中传入数组的解决方案(转载)
- 根据传入的size创建数组
- 判断传入的参数是否是数组
- c语言函数如何获取传入的数组(指针)的指针所指向内容的长度
- 再解为啥c里函数传入数组时必须同…
- C语言:返回传入字符串的长度
- 传入一个数组,输出这个数组里面的所有排列
- BaseFragment的抽取
- find the safest road hd 1596
- Windows平台编译libevent
- POJ1112——Team Them Up!(动态规划,二分图判定)
- css定义table表格边框技巧分享
- C/C++传入数组及怎样限定传入数组的大小
- PCL中std::numeric_limits::max()编译错误
- 一步步将vim改造成C/C++开发环境(IDE)
- 推荐系统的相关算法SVD
- 深入浅出spring IOC中三种依赖注入方式
- Android闹钟开发问题点记录
- VS中DEBUG和RELEASE运行结果不一样
- hdu1251-> 统计难题(Trie树入门题)
- springmvc是否需要应用view处理器