`

[转]数组引用(C++)

    博客分类:
  • C++
 
阅读更多
"数组引用"以避免"数组降阶"(本文曾贴于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 );
}


My test Code
#include <iostream.h>
// 参数为10个int的数组
// parameter is a reference to an array of 10 ints
void putValues(int (&arr)[10])
{
    cout << sizeof(arr)/sizeof(int) << endl;
}

int main()
{
    int i, j[2];
    int a[10];
    cout << sizeof(a) << endl;
//     putValues(i); // 错误:实参不是10个int的数组
//     putValues(j); // 错误:实参不是10个int的数组
    putValues(a); // 正确
    return 0;
}


link:http://hi.baidu.com/cdysxy1987/blog/item/313bbfd4d53df82506088b64.html
分享到:
评论

相关推荐

    C#调用C++ Dll关于结构体数组引用的传递及解析使用的展示代码

    ### C#调用C++ DLL:结构体数组引用的传递及解析使用详解 #### 引言 在跨语言编程环境中,经常会遇到不同编程语言之间进行交互的需求。C#与C++之间的互操作就是一个典型场景。当C#需要调用C++开发的动态链接库...

    C++指针 数组 内存释放.docx

    C++指针数组内存释放 C++指针是一种基本变量,包含一个实际的数据,该数据代表一个可以找到实际信息的内存地址。指针是C++编程中非常重要的概念,许多程序和思想依靠指针作为他们设计的基础。 定义指针变量 定义...

    c++ 课件 数组 引用

    在C++编程语言中,数组、引用和指针是三个重要的概念,它们是理解C++内存管理和数据操作的关键。下面将分别对这三个概念进行详细解释。 ### 1. 指针 指针是一个变量,它存储的是另一个变量的内存地址。在C++中,...

    C++第4章_数组与指针(C++课件,中南大学)

    在C++编程语言中,数组和指针是两个非常重要的概念,它们在处理大量数据时发挥着关键作用。数组提供了一种方式来存储同一类型的多个数据项,而指针则是指向这些数据项的地址,使得我们可以高效地访问和操作数组。 ...

    C++Builder动态对象数组

    ### C++Builder动态对象数组:TList类、DynamicArray与STL中的Vector容器 #### TList 类 在C++Builder中,TList是用于管理动态对象数组的一种方式。它提供了较为简便的方式来创建、管理和销毁一系列对象。TList...

    C#将字符串数组传递给C++ DLL.rar

    C#中的字符串是引用类型,由.NET框架管理,而C++中的字符串可以是字符数组(char*)或宽字符数组(wchar_t*)。因此,传递字符串数组时,需要进行适当的类型转换。 1. **定义C++ DLL接口**: 在C++ DLL中,我们...

    c#调用c++DLL,dll有二维数组

    在C++中,二维数组通常以指针的形式传递,因为C++不支持引用参数。而在C#中,我们通常使用`unsafe`上下文来处理指针。 1. **C++ DLL的定义**: 在C++中,创建一个二维数组函数可能如下所示: ```cpp extern "C" ...

    程序设计-C and C++的实现:第7章 数组与C++标准库类模板vector.pdf

    数组和C++标准库类模板vector是程序设计中的基本结构,了解数组和vector的声明、初始化、引用和操作是编程的基本技能。本章节对数组和vector进行了详细的介绍,希望读者能够掌握数组和vector的基本概念和操作方法。

    zhizhenshuzu.rar_C++数组_array_数组_数组c++

    在C++编程语言中,数组是一种非常基础且重要的数据结构,它允许我们存储相同类型的数据集合。本资源“zhizhenshuzu.rar”显然关注的是C++中的数组和指针数组的概念,这对于理解和操作内存以及高效编程至关重要。 ...

    C++对数组的应用C++对数组的应用 C++对数组的应用

    C++对数组的应用 C++中的数组是一种基本的数据结构,它可以...C++中的数组引用的机制可以解决数组降价问题,提供了一种灵活的方式来传递数组。然而,这种机制也存在一些限制,例如数组引用的大小必须在编译时确定。

    第5章 数组(C++版).ppt

    本章主要介绍了C++中的一维数组,包括其使用背景、定义方式以及如何引用数组元素。 一维数组在C++中的应用广泛,尤其是在处理批量数据时,能够显著提高代码的简洁性和效率。在上述例子中,我们看到如何使用一维数组...

    c++ 二级指针与二维数组之间值操作

    二维数组在C++中本质上是一级指针的数组,每个元素又是一个一级指针,指向一维字符数组。因此,二级指针可以用来直接访问和修改这些一维数组的内容。下面将详细解释这个过程: 1. **二级指针的声明**: 在C++中,...

    C++课程课件数组(郭艳燕老师)

    【C++课程课件数组(郭艳燕老师)】课件涵盖了C++中关于数组的基础知识,主要包括以下几个方面: 1. **数组的概念**:数组是一种数据结构,它将具有相同类型的数据元素集合在一起,通过一个统一的名字进行表示,...

    C++指针及数组应用

    对于新手而言,掌握指针和数组的使用方法至关重要,因为这不仅有助于理解C++语言的深层次机制,还能为编写高效且安全的代码打下坚实的基础。 指针是C++中的一个变量,它存储了另一个变量的内存地址。指针的类型决定...

    C++程序设计讲义-数组

    在实际编程中,常使用指针或者引用来处理数组参数,以便更灵活地操作数组。 六、动态数组与vector容器 虽然C++标准库中也有固定大小的数组(如std::array),但更常用的是动态数组(通过new运算符创建)和动态大小...

    c++ 数组详解

    在C++中,数组是一种非常基础且重要的数据结构,它允许程序员存储一组同类型的元素。在数组详解中,我们将深入探讨一维数组、二维数组以及字符数组(即字符串)的定义、初始化、引用以及相关操作。 1. **一维数组**...

    ELS.rar_数组作为引用

    使用数组引用,我们可以先复制方块的当前状态到一个新的临时数组,然后在临时数组上进行旋转操作,最后再将结果写回原数组。这样可以避免对原数组的直接修改,确保操作的正确性。 此外,使用引用还可以减少内存开销...

    C++数组(2013级-C++程序设计)

    通过上述内容的讲解,2013级C++程序设计的学生将掌握数组的概念、一维和二维数组的定义与引用、数组作为函数参数的使用以及字符数组和C++中字符串处理的方法。这些都是C++编程的基础知识,对于后续更高级编程概念的...

    2.1.1 C++和C#数据传递 -常用类型数组和List类型传递

    总的来说,C++和C#在数据传递上都支持值传递和引用传递,但C++需要明确选择引用或指针来实现引用传递,而C#总是进行引用传递。数组和列表在两者的处理方式上有共同之处,但C++的`std::vector`更强调内存管理和性能...

    ttf文件转换成C数组

    4. 头文件生成:提供一个头文件,声明这些数组和结构,使得在其他源文件中可以方便地引用。 5. 用户配置:允许用户自定义输出数组的名称、大小或其他参数。 使用转换后的C数组,程序员可以直接在代码中访问和渲染...

Global site tag (gtag.js) - Google Analytics