数组降阶是个讨厌的事,这在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,坐等程序崩溃。在一些要求较高的场合就不能使用数组做参数。那么在C语言中怎样解决这个问题?
没办法,应该说没有好办法。a:做个结构,其中仅一个char array[20],然后用这个结构指针代替char array[20]。可见这是个很繁琐的办法,且不直观;b:在Test内部使用_msize来计算array长度。这更不行,首先它使得错误的发现被推迟到运行期,而不是编译期,其次_msize长度/元素大小>=array长度,也就是说就是new char[19]和new array[20]分配的大小是一样的,这样一来,虽不至于导致程序崩溃,但运算结果却不正确。

数组引用是怎样申明的呢?#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 );
}

使用这种方法也不能解决全部问题如:想用 char (&array)[][20]来声明一个数组作为函数的参数,这样编译器会报错。因为

char (&)[] 指的是声明一个 char[]类型的数组作为引用。因为[][20]未指明[]有多少个,因此系统并不知道这是哪种类型,所以会报错。这种情况下可以改用 vector类型。

数组引用以避免数组降阶(c++)相关推荐

  1. perl 数组引用_Perl中数组引用的魔力

    perl 数组引用 在编程世界中,如果不遇到嵌套的数据结构,您将走得很远. 例如,JavaScript对象可能如下所示: var cats = { "name":"Mr. ...

  2. 提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用

    文章目录 函数式接口概述 函数式接口示例 内置函数式接口 Lambda简述 Lambda语法 方法引用 构造器引用 数组引用 函数式接口概述 只包含一个抽象方法的接口,称为函数式接口. 可以通过 La ...

  3. Java数组基础笔记(引用、字符串数组)

    文章目录 数组的新建 数组的引用概念 字符串数组引用的奇妙 数组的新建 数组的新建有多种方式,需要注意返回值类型是int[],新建方式如下几种: int[] ns: ns = new int[] {1 ...

  4. 【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译

    本次笔记内容: 6-3 简单赋值语句的翻译 6-4 数组引用的翻译 本节课幻灯片,见于我的 GitHub 仓库:第12讲 中间代码生成_2.pdf 文章目录 简单赋值语句的翻译 赋值语句翻译的任务 赋 ...

  5. C++的一般引用及其数组引用

    引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: [例1]:int a; int &ra=a; //定义引 ...

  6. c语言向自定数组_C语言一维数组的定义和引用

    C语言一维数组的定义和引用 C语言支持一维数组和多维数组.如果一个数组的所有元素都不是数组,那么该数组称为一维数组. 一维数组的定义方式 在C语言中使用数组必须先进行定义.一维数组的定义方式为: 类型 ...

  7. 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用

    一.数组指针和指针数组 1.数组指针(行指针) 首先要知道数组指针是指向数组的指针.所以数组指针本质是个指针,只不过指向一个数组而已.格式为:T (*ptr)[]. 注意:"[]" ...

  8. c++ 数组引用_在 Solidity中使用值数组以降低 gas 消耗

    背景 我们Datona Labs在开发和测试Solidity数据访问合约(S-DAC:Smart-Data-Access-Contract)模板过程中,经常需要使用只有很小数值的小数组(数组元素个数少 ...

  9. java的常用引用类、数组、String类

    java的常用引用类.数组.String类 1. 常用引用类 1.1 Scanner 一个简单的文本扫描器类. 使用: //创建扫描器对象 Scanner sc = new Scanner(Syste ...

最新文章

  1. 指针运算(自己做个笔记)
  2. 第四章函数作业题,函数模板
  3. #每天问自己个问题#6. SIP标准协议 RFC3261
  4. Linux系统起源及主流发行版
  5. hdu4604 不错的子序列问题
  6. python微博接口_python调用微博api接口
  7. linux中VScode中文乱码问题:一行代码解决
  8. 一些常见监控服务如Nagios、Cacti和Zabbix的搭建
  9. 菜鸟入门Docker
  10. 简单介绍一下用加速度传感器修正角速度传感器(陀螺仪)累计误差的原理
  11. android 版本lollipop,Android 5.0 Lollipop系统BUG盘点
  12. 有趣的算法:捞鱼问题
  13. 2021蓝桥杯预选赛题解
  14. 最强AngularJS资源合集
  15. 【Flutter】----学习笔记1(1~5)
  16. java 下载图片流
  17. “老衲印象”开发团队章程
  18. 脉冲星 1 月脉动 | Pulsar 2.5.0 和 Pulsarctl 0.3.0 发布,多项活动期待您的参与
  19. ggplot2组合绘制多个图形
  20. 阅读图像显著性检测论文五:2011年版本的Global Contrast Based Salient Region Detection

热门文章

  1. 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze
  2. 大型互联网b2b b2c o2o电子商务云平台
  3. C语言中两种方式表示时间日期值time_t和struct tm类型的相互转换
  4. python学习笔记3—流程控制if、for、while
  5. apache下配置php
  6. docker+springboot部署总结
  7. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例...
  8. Selenium2学习(八)-- 操作元素(键盘和鼠标事件)
  9. 听说,京沪津的人都爱直接“看牌”买买买
  10. 30_栈的定义.swf