對於二維數組,&a與&a[0]與a一樣嗎?


一樣,又不一樣。
說一樣,是因為它們的值是一樣的;說不一樣,是因為他們的類型不一樣。
這里,我做了一組測試:

int a[2][2] = { 1,2,3,4 };
auto g = &a;
auto p = &a[0];
auto q = a[0];
cout << g << endl; cout << p << endl; cout << q << endl;

輸出的結果都是008FFE98。
那么使他們自加1會怎么樣呢?

++q;
    ++p;
    ++g;
    cout << g << endl;
    cout<< p << endl;
    cout << q << endl;

輸出的結果依次是:
008FFEA8
008FFEA0
008FFE9C
由此可以得出結論:他們所指的對象不一樣!
現在來看剛才三個auto的真實類型是什么。
我把auto全部換成int,vs給我報錯的同時也告訴了我他們的類型:
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

所以他們真正的類型是:

    int (*g)[2][2]= &a;
    int (*p)[2]= &a[0];
    int *q = a[0];

反正是類似於函數指針的東西吧。
g是指向整個二維數組的指針,p是指向二維數組中整個a[0]的指針,q是指向a[0][0]的指針;當他們各自自加1時:g指向下一個相鄰的下一個二位數組,p指向a[1],q指向a[0][1];此時g指向的東西是未知的,所以這時候輸出什么都不奇怪,我們來看看這時輸出g指向的二維數組的元素是什么吧:

for (int i = 0; i < 4; ++i) {
        cout << (*(*g)+i) <<" "<< *(*(*g)+i)<<endl;
    }

這里寫圖片描述
你看,輸出的是這種亂七八糟的東西。

最后,獻上測試的全部代碼:

#include<iostream>
using namespace std;
int main() {
    int a[2][2] = { 1,2,3,4 };
    int (*g) [2][2]= &a;
    int (*p)[2]= &a[0];
    int *q = a[0];

    cout << g << endl;
    cout << p << endl;
    cout << q << endl;
    ++q;
    ++p;
    ++g;
    cout << g << endl;
    cout<< p << endl;
    cout << q << endl;

    cout << endl;
    for (int i = 0; i < 4; ++i) {
        cout << (*(*g)+i) <<" "<< *(*(*g)+i)<<endl;
    }
    system("pause");
    return 0;
}

這里寫圖片描述

最后說明一下a[0]和&a[0][0],前者是一維數組,后者是指針,雖然不一樣,但是兩者各自加1后都是指向a[0][1]的。

//更新
今天才發現原來有typeid().name()這么個函數,用這個函數就能直接輸出類型了,真是一個悲傷的故事呢。

#include<iostream>
using namespace std;
int main() {
    int a[2][2] = { 1,2,3,4 };
    int(*g)[2][2] = &a;
    int(*p)[2] = &a[0];
    int *q = a[0];

    cout << typeid(g).name() << endl;
    cout << typeid(p).name() << endl;
    cout << typeid(q).name() << endl;

    system("pause");
    return 0;
}

這里寫圖片描述


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com