c++ - 关于二维数组在内存中的存在形式的问题
PHPz
PHPz 2017-04-17 15:37:18
0
2
837

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

#include  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???

PHPz
PHPz

学习是最好的投资!

全員に返信 (2)
黄舟

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

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

いいねを押す+0
    PHPzhong

    断点调试下监视下如下内容:
    a
    &a
    a+0
    a[0]
    &a[0]

    对于上述问题,首先知道三点:
    (1)二维数组就是一维数组
    这个很好证明,依次输出地址,都是连续的,不多说。
    (2)数组地址是什么?
    先从一维数组开始int b[2],数组地址就是对一个数组名进行取址,例如&b就是数组地址。
    二维的int a[2][2],a是二维数组名,&a就是二维数组地址;a[0]是第一行的数组名(姑且叫第一行),&a[0]是第一行数组的数组地址,同理a[1],&a[1]分别是第二行数组名和数组地址。
    (3)数组名可以转化为指针
    首先纠正一点int b[2],这里的b不是指针,同样的,int a[2][2],里边的a也不是指针,但是a和b可以转化为指针,可以转化不代表它就是,谁告诉你int就是short了。

    好了,要理解你的代码为什么这样,最好的办法直接监视类型即可。

    注意看a[0]与b的类型。

    いいねを押す+0
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート
      私たちについて 免責事項 Sitemap
      PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!