博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【引用】数组不能有引用
阅读量:5049 次
发布时间:2019-06-12

本文共 2396 字,大约阅读时间需要 7 分钟。

网友1:

今天在编写《编程之美》上的代码,遇到了如下的问题:          void  function(int &array[5])          {                //…………           }           void main()           {                 int arr[5]={1,2,3,4,5};                 function(arr);           }        为什么不正确呢??求真相~~        非常感谢
 
 

网友2:

void  function(int &array[5])形参的&,也就是引用是数组的引用,但是C++中没有数组的引用,即使改为:void  function(int *&array) 也不对,因为实参是常量指针,不是形参的普通指针

 

网友3:

void  function(int (&array)[5])
 

网友4:

"数组引用"以避免"数组降阶"(本文曾贴于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 );
}

 

 

网友5:

传数组引用效率相当于传指针,而且包含更多信息,不是很好吗?

我不久前见过一个模板函数就和周星星的方法一样:
template<class T,size_t N>
        void Test(T (&array)[N])
{
        cout<<typeid(T).name()<<endl;
        cout<<N<<endl;
}

 

 

网友6:

用了vector,编译器又会做很多东西,

但是更直观!支持vector

 

 

网友7:

在网上看到一篇博客写到C++中不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。但是int a[3] ={10,20,30};int (&b)[3] = a;这段程序是可以执行通过的,而且b和a都指向同一个地址,b是不是a数组的引用呢?

 

 

网友8:

不能建立数组的引用是说,数组的元素不能是引用。而你写的int (&b)[3] = a;b本身是一个引用,b不是数组。b的引用是数组名a.如果建立数组的元素是引用的数组是int& b[3];这样b才是数组,数组中元素才是引用。但是int& b[3];这样C++不支持,因为引用不可以作数组中的元素。主要引用不可以作为数组元素的原因是它不支持传统意义的复制。传统意义的复制:int a = b;a和b在内存中分别占用,内容一致。如果int &a = b;这种复制,内存中a并不分配新的内存。

 

转载于:https://www.cnblogs.com/yqskj/articles/2207168.html

你可能感兴趣的文章
Topological Sor-207. Course Schedule
查看>>
/MD, /MT, /LD (Use Run-Time Library)
查看>>
pahlcon:循环调度(Dispatch Loop)或跳转
查看>>
Java学习--异常处理及其应用类
查看>>
HTTP协议
查看>>
【python-opencv】opencv基础操作之四-人脸裁剪与对齐
查看>>
【python-opencv】opencv基础操作之一。1
查看>>
记一次织梦cms渗透测试
查看>>
数据标注竞品概要分析
查看>>
第二周java学习总结
查看>>
第四周课程总结&试验报告(二)
查看>>
第三周课程总结&实验报告一
查看>>
第五周课程总结&试验报告(三)
查看>>
经典知识问答
查看>>
一个合格(优秀)的前端都应该阅读这些文章
查看>>
springboot成神之——Basic Auth应用
查看>>
《python3网络爬虫开发实战》--数据存储
查看>>
centos 安装配置python虚拟环境、pip
查看>>
淘宝开放平台使用WebClient,WebRequest访问时的错误提示导致麻烦
查看>>
关于Linux安装Mono 3.4的bug
查看>>