二維數組和指針

1. 指針是變量的地址

#include <iostream>

using namespace std;

int main()
{
    int a = 3;
    int * p = &a;

    cout << a << endl;  // 3
    cout << *p << endl;  // 3

    return 0;
}

如上面這段程序所示,經過取地址符 &,指針 p 得到了變量 a 的地址,那麼解引用符 * 就能夠從 p 中獲得變量 a 的值。ios

也就是說,p=&a*p=a 是等價的。p 是變量 a 的地址,從 p 中就能夠取出 a 的值。反之,能從 p 中取出 a 的值,p 也就是變量 a 的地址。數組

2. 一維數組的數組名是數組的首地址

#include <iostream>

using namespace std;

int main()
{
    // 一維數組的數組名就是數組的首地址
    int data[3] = {1, 2, 3};

    int *p1 = data;
    cout << p1[1] << endl;      // 2
    cout << *(p1+1) << endl;    // 2

    int *p2 = &data[0];

    cout << p2[1] << endl;      // 2
    cout << *(p2+1) << endl;    // 2

    return 0;
}

一維數組的數組名是數組的首地址,因此 int *p1 = data; 讓指針 p1 也指向了數組首地址。這時候 *p1 是數組的第一個元素,*(p1+1) 也便是數組的第二個元素。spa

又由於 *p1 是數組的第一個元素,說明 p1 是數組第一個元素的地址,因此 int *p2 = &data[0]; 與上面等效。指針

3. 二維數組是數組的數組,其數組名是外層數組的首地址

#include <iostream>

using namespace std;

int main()
{

    int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    // 行指針
    //int (*p)[3] = &data[0];
    int (*p)[3] = data;

    cout << p[1][2] << endl; // 6
    cout << (*(p+1))[2] << endl; // 6
    cout << *(p[1] + 2) << endl; // 6
    cout << *(*(p+1)+2) << endl; // 6

    return 0;
}

data[3][3] 至關因而數組 data[data[0], data[1], data[2]],data[0], data[1], data[2] 都是有 3 個元素的一維數組,而 data 則是有 3 個這樣數組的一維數組。code

int (*p)[3] 表示行指針 p 指向一個有三個元素的數組,也就是指向外層數組的首地址,而 data&data[0] 是等價的。第一次解引用獲得它指向的數組,第二次解引用才獲得數組中的值。io

#include <iostream>

using namespace std;

int main()
{

    int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    // 列指針
    //int *p = *data;
    //int *p = data[0];
    int *p = &data[0][0];

    cout << p[1 * 3 + 2] << endl;
    cout << *(p + 1 * 3 + 2) << endl;

    return 0;
}

列指針是將二維數組展開成一維數組看待,因此列指針指向二維數組的第一個元素。&data[0][0]data[0]*data 三者都表明第一個元素的地址,訪問元素須要一次解引用,[]* 等價。class

獲取更多精彩,請關注「seniusen」!stream

相關文章
相關標籤/搜索