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相同。

时间: 2024-10-25 13:41:41

C++的auto在用多维数组进行初始化时一个易混淆的情况的相关文章

*二维数组的初始化

package com.chongrui.test; /* *二维数组的初始化 * */ public class test { public static void main(String[] args) { int a[][]=new int[3][4]; System.out.println("输出3行4列的数组"); for(int i=0;i<a.length;i++){ for(int j=0;j<a[i].length;j++){//遍历数组当中的每个元素,

二维数组的初始化,遍历

1 package com.baidu.java; 2 //2维数组的初始化 3 public class Array2 { 4 public static void main(String[] args) { 5 //1.静态初始化 6 int[][] aa=new int[][]{{3,4,5},{6,7,8,9},{1,2}}; 7 //2.1动态初始化 8 String[][] bb=new String[6][5];//想成6个小组,每个小组5个人 9 //2.2动态初始化 10 St

java二维数组的初始化及使用其长度

二维数组的初始化 1.静态初始化 int intArray[ ][ ]={{1,2},{2,3},{3,4,5}}; Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同. 2.动态初始化 1) 直接为每一维分配空间,格式如下: arrayName = new type[arrayLength1][arrayLength2]; int a[ ][ ] = new int[2][3]: 2) 从最高维开始,分别为每一维分配空间: arrayNa

每天一点儿JAVA之数组篇--一维和多维数组的初始化和基本操作

<span style="font-family: Arial, Helvetica, sans-serif;"> * <p>Description: 演示一维数组和多维数组的初始化和基本操作</p></span> * <p>Copyright: Copyright (c) 2014</p> * <p>Filename: myArray.java</p> * @author w王海涛 * @

VB6之多维数组中元素在内存中的排列情况

1 Private Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long) 2 3 4 'code by lichmama from cnblogs.com 5 Private Sub Form_Load() 6 Dim a(2) As Byte 7 Dim b(2, 2) As Byte 8 Dim c(2, 2, 2) As Byte 9 1

动态申请 二维数组 以及初始化、 赋值

二维堆数组 可以利用指针的指针 例如 int ** array = new int[i][j]; 但是这样不能通过编译,因为堆数组不像基于栈数组那样工作,为其分配的内存是不连续的,因此堆数组分配足够的内存是不对的,应当先分配基于堆数组第一维数组下标分配一个连续的数组.该数组的每一个元素实际上是指向一个数组的指针. 一个测试小例: #include <iostream> #include <stdio.h> #include <cstring> using namespa

二维数组与指针的一个例子

刚在网上看到的一个题目,觉得有点意思就做了一下:输入m,n,返回一个m*n的零矩阵. 方案一:用一维指针解决,比较简单 #include<stdio.h> #include<malloc.h> int main() {  int m,n,i,j,*p;  printf("input m,n\n");  scanf("%d%d",&m,&n);  p = (int *)malloc(m*n*sizeof(int));   //m

【2016.4.27】二维数组分组:按照一个键值,按照多个键值

<?php $arr = array( array('id' => 1, 'name' => 'seu','brand'=>'临'), array('id' => 1, 'name' => 'seu','brand'=>'临'), array('id' => 3, 'name' => 'njupt','brand'=>'兵'), array('id' => 3, 'name' => 'njupt','brand'=>'斗'),

c语言中用简单方法对多维数组进行初始化

例:int array[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; 说明:a.由4*3可知,本二维数组包含12个元素,因此初始化时array[0][0] = 1 ,array[0][1] = 2......,可以通过简单方法,即直接大括号包含数据的形式初始化,默认从第一个元素进行初始化.   b.记住多维数组也是存储数据,每个数组内部的元素可以存储一个数据,因此此2维数组可以存储12个数据.   c.也可以理解成4行3列,每个坐标中存储一个数据. 详细理解可参考: