關於c/c++中的二維數組與指針

  設a是一個一維數組的數組名,則a表示其第一個元素的地址(即&a[0]),而&a表示整個數組的地址!儘管二者值相同(&a[0]==&a),所以&a是地址,*(&a)也是地址,**(&a)是第一個元素(見c++pp第245,246頁和c第192頁)

將非const值賦給const變量是合法的,反之是非法的,所以,在函數聲明中形參應儘量使用const,這樣不管const和非const實參都能傳遞給函數(c++pp263頁)ios

#include <iostream>
using namespace std;

int main()
{
    int x[4][3]={1,2,3,99,5,6,7,8,9,10,11,12};

    int (*p)[3] = x;  //在聲明的時候,這裏指p是這樣一種指針類型:(*)[3],即指向3個int的指針(每次自增1的長度爲3個int的長度)。不要作其餘理解!!

    cout << x << endl;
    cout << (*p)[3] << endl;
    cout << *p[3] << endl;  // []的優先級高於*,因此先解釋爲p[3],即*(p+3),而p是指向3個int的指針,因此p+3指向{10,11,12}(即保存{10,11,12}的地址),因此*(p+3)(即p[3])爲10的地址,因此*p[3](即*(*(p+3)))爲10
    cout << *(*(p+3)) << endl;

    int a[2][3]={{1,2,3},{4,5,6}};
    int  i,j;
    int (*k)[3];
    k = a;
    cout << "a:" << a <<endl;
    cout <<"&a[0][0]: " << &a[0][0] << endl;
    cout << "k: " << k << endl;  // 第一個一維數組的地址!!
    cout << "k+1: " << (k+1) << endl;  //第二個一維數組的地址!!
    cout << "k+1: " << *(k+1) << endl;
    cout << "*k: " << *k << endl;  // 第一個一維數組的第一個元素的地址!!
    cout <<  "**k: " << **k << endl;  // 第一個一維數組第一個元素
    // 綜上所述,就像一維數組同樣,設a是一個一維數組的數組名,則a表示其第一個元素的地址(即&a[0]),而&a表示整個數組的地址!!儘管二者值相同(&a[0]==&a),所以&a是地址,*(&a)也是地址,**(&a)是第一個元素(見c++pp第245,246頁和c第192頁)
    for (i=0;i<2;i++)
    {
        cout << "k[i]: " << k[i] << endl;
        for (j=0;j<3;j++)
            cout << k[i][j] << "##" << &k[i][j] << endl;
    }

    return 0;
}
相關文章
相關標籤/搜索