zoukankan      html  css  js  c++  java
  • C++的auto在用多维数组进行初始化时一个易混淆的情况

    先看下面这段程序:

    int arr[1][10] = {0,1,2,3,4,5,6,7,8,9};
    for (auto *p = arr;p != end(arr); p++){
        cout << "p is " << typeid(p).name() <<endl;
        cout << "*p is " << typeid(*p).name() <<endl;
    }
    for (auto *q : arr){
        cout << "q is " << typeid(q).name() <<endl;
        cout << "*q is " << typeid(*q).name() <<endl;
    }
    for (auto &r : arr){
        cout << "r is " << typeid(r).name() <<endl;
    }

    程序运行的结果为

    p is int (*)[10]

    *p is int [10]

    q is int *

    *q is int

    r is int [10]

    C++中,对数组进行操作时通常是对指针进行操作。用数组名来初始化一个指针时,得到的是指向该数组第一个元素的指针。

    多维数组的实质是元素为数组的数组。如int a[3][4]是一个有三个元素的数组,其元素是有四个整型元素的数组。因此,auto *p = a,p是指向数组a的第一个元素的指针,即指向有四个整型元素的数组的指针,*p是a的第一个元素,即有四个整型元素的数组。

    但在range for中,例子里的auto *q = arr却是指向数组元素(有四个元素的数组)的第一个元素的指针。因此q是指向整型元素的指针。如果数组有更多维,如int a2[3][4][5],a2的第一个元素是一个有四个元素的数组,这四个元素都是有五个整型元素的数组。此时for(auto *p : a2)中,p的类型是int (*)[5]。

    为了防止这种差别带来的错误,可以在range for中使用引用。for (auto &r : arr)中,r是数组元素的引用,其类型跟auto *p = arr, *p相同。

  • 相关阅读:
    《模糊测试--强制发掘安全漏洞的利器》阅读笔记(一)
    BrickerBot
    这些写的很好的PCA文章
    决策树(挖坑待填)
    线性回归
    关于给定DNA序列,如何找到合理的切割位点使得其退火温度保持相对一致
    生成全排列
    AVL树学习笔记
    二叉搜索树
    堆排序
  • 原文地址:https://www.cnblogs.com/DigiK0ne/p/4170053.html
Copyright © 2011-2022 走看看