C++数组引用
来源:互联网 发布:淘宝商城衣服 编辑:程序博客网 时间:2024/06/16 11:37
网友1:
今天在编写《编程之美》上的代码,遇到了如下的问题: void function(int &array[5]) { //………… } void main() { int arr[5]={1,2,3,4,5}; function(arr); } 为什么不正确呢??求真相~~ 非常感谢
网友2:
"数组引用"以避免"数组降阶"(本文曾贴于VCKBASE\C++论坛)
受[hpho]的一段模板函数的启发,特写此文,如有雷同,实在遗憾。
数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是"数组降阶"
#include <IOSTREAM>
using namespace std;
void Test( char array[20] )
{
cout << sizeof(array) << endl; // 输出 4
}
int main( void )
{
char array[20] = { 0 };
cout << sizeof(array) << endl; // 输出 20
Test( array );
}
为什么同样申明的array一个输出20一个输出4?这是因为void Test( char array[20] )中的array被降阶处理了,void Test( char array[20] )等同于void Test( char array[] ),也等同于void Test( char* const array ),如果你BT(开玩笑),它也等同于void Test( char array[999] )。
就是说
void Test( char array[20] )
{
cout << sizeof(array) << endl;
}
被降成
void Test( char* const array )
{
cout << sizeof(array) << endl; // 既然是char*,当然输出4
}
这样一来问题大了,你完全可以定义一个不足20个元素的数组,然后传给Test,坐等程序崩溃。在一些要求较高的场合就不能使用数组做参数,真TMD心有不甘。
那么在C语言中怎样解决这个问题?
没办法,应该说没有好办法。a:做个结构,其中仅一个char array[20],然后用这个结构指针代替char array[20]。可见这是个很繁琐的办法,且不直观;b:在Test内部使用_msize来计算array长度。这更不行,首先它使得错误的发现被推迟到运行期,而不是编译期,其次_msize长度/元素大小>=array长度,也就是说就是new char[19]和new array[20]分配的大小是一样的,这样一来,虽不至于导致程序崩溃,但运算结果却不正确。
感谢[hpho],受其启发,C++中有C所没有的"引用",但数组引用是怎样申明的呢?经过几番试验,Look
#include <IOSTREAM>
using namespace std;
void Test( char (&array)[20] ) // 是不是很像 char *p[20] 和 char (*p)[20] 的区别?
{
cout << sizeof(array) << endl;
}
int main( void )
{
char array[20] = { 0 };
cout << sizeof(array) << endl;
Test( array );
}
在网上看到一篇博客写到C++中不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx但是int a[3] ={10,20,30};int (&b)[3] = a;这段程序是可以执行通过的,而且b和a都指向同一个地址,b是不是a数组的引用呢?
- 数组引用(C++)
- c++-引用二维数组
- [C/C++]数组的引用、多维数组
- c++-引用一维数组
- 【C】指针、引用和数组
- [C++]关于数组的引用和引用的数组
- C中数组的另类引用
- C中数组的另类引用
- C#中数组是引用类型
- C语言之指针,数组,引用
- C/C++对数组的引用
- C/C++指针、数组和引用
- 【C++】指针,数组名,引用的区别
- C语言之指针,数组,引用
- C语言通过指针引用数组
- C通过指针引用数组元素
- 【C++】定义和引用二维数组
- C语言指针引用二维数组
- ThreadPoolExecutor运转机制详解
- 堆,栈的区别
- 随手笔记-SQLPLUS使用-初级
- Eclipse中运行远程debug
- Linux时间函数
- C++数组引用
- MyEclipse6.5注册机,激活类
- SQLSERVER语句的执行时间
- PL/SQL 0.几秒出结果,SQL效率一定高吗?
- 获取linux系统ip的方法
- Coherence(4)-替代PutAll
- xTuple中变量的模糊查询方法
- ffmpeg 2.2 Android 平台编译
- Android 滑动效果入门篇(一)—— ViewFlipper