c++ - 关于二维数组在内存中的存在形式的问题

查看:130
本文介绍了c++ - 关于二维数组在内存中的存在形式的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

书上说二维数组在内存中实际是以一维数组的形式连续存放的,我做了个小测试结果却令我无法理解。

#include <iostream>
using namespace std;

int main() {
    int a[2][2] = {{0,1},{2,3}};
    cout << &a << endl;
    cout << a << endl;
    cout << *a << endl;
    cout << a[0] << endl;
    cout << **a << endl;
    cout << *(a[0]) << endl;
    return 0;
}

输出:

0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0
0

那个内存地址处保存的是自己的地址?那么两次解引用不应该还是这个地址才对吗?怎么会变成0???

解决方案

你应该这样理解,在C里面只有一维数组,只不过数组的元素可以是任意类型,包括数组本身,所以才有二维数组。这样的话,对一个数组名解引用(这时候数组名就是指向该数组第一个元素的指针)得到的就是该数组的第一个元素,而二维数组的第一个元素是一个一维数组,所以再次解引用就是这个一维数组的第一个元素。就跟你下面那个*(a[0])是一样的。

对于你说的那个问题,数组a这个名字就是指向a这个数组内容的指针,他的值和他第一个元素的地址是一样的。对于二维数组来说,a,a[0]的地址,a0的地址这三个值是一样的,但是含义略有不同,a和a[0]的地址具有相同含义,是一个二级指针,但a0的地址却是一个一级指针

这篇关于c++ - 关于二维数组在内存中的存在形式的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆