关于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页)

#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;
}

 

posted @ 2019-10-04 20:55  大黑耗  阅读(2638)  评论(0编辑  收藏  举报