指向二维数组的指针

来源:互联网 发布:js设定div高度 编辑:程序博客网 时间:2024/05/21 09:30

 

    在C++ Primer第四章遇到了二维数组和指针的内容,理解起来有点绕,这里做个小节。

    在C++ Primer中介绍了一种访问二位数组的方式,定义一个指向一位数组的指针,通过这个指针访问二维数组:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
usingnamespacestd;
int main()
{
    inttwoArray[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};  
    int(*p)[4] = twoArray;  // 定义一个指向一维数组的指针
    cout <<"size of p is: "<<sizeof(p) << endl; // p占用4个字节,说明其是一个指针
    for(p = twoArray; p != twoArray + 3; ++p) {  // 第一层循环,每个循环遍历一行元素
        for(int*q = *p; q != *p + 4; ++q) {     // 第二层循环,每次循环输出一个元素
            cout << *q << "  ";
        }
        cout << endl;
    }
    return0;
}

这里需要有几个地方值得注意:

(1)(*p)[4] 和 *p[4]的区别

        (*p)[4]是定义一个指向一维数组的指针,这个一维数组有4个元素;而*p[4]是定义了一个包含四个指针元素的指针数组。用sizeof()计算两个p,发现第一个p的大小是4,也即它是一个指针,第二个p的大小是16,因为它是一个包含4个指针的数组。

(2)上面程序的循环里*p代表的含义是什么

        要弄清这个问题,我们先要看看二维数组的表示方法:

        二维数组

        上图表示了二维数组的存储方法,twoArray[0]~twoArray[2]表示各一维数组的首地址,二维数组名twoArray表示整个二维数组的首地址,它和twoArray[0]以及twoArray[0][0]是同一个地址。但是他们表示的级别是不同的,因此不能混用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    inttwoArray[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};  
    int(*p)[4] = twoArray;  // 定义一个指向一维数组的指针
    p++;
    cout << twoArray[1] << endl;   //比较twoArray[1]和&twoArray[1]的区别
    cout << &twoArray[1] << endl;
    if(p == &twoArray[1]) {           // 必须是 &twoArray[1]
        cout <<"true"<< endl;
    }else{
        cout <<"false"<< endl;
    }
    return0;
}
?
1
 twoArray[1]和&twoArray[1]输出的内容是相同的,都是第1行的首地址,但是他们的含义是不同的,twoArray[1]

是元素级别的,是int*,而&twoArray[1]是行级别的,是int(*p)4。也就是说,如果对twoArray[1]加1,那么指针移动到下一个元素的位置,而如果对&twoArray[1]加1,指针移动到下一行的位置:

?
1
2
3
cout << **(&twoArray[1] + 1) << endl;
cout << *(twoArray[1] + 1) << endl;
<SPAN style="FONT-FAMILY: Verdana"face="Verdana">    上面代码的结果是第一行输出8而第二行输出5,且因为&twoArray[1]行级别的,因此需要两次解引用才能取得实际元素的值。</SPAN>
?
1
<SPAN style="FONT-FAMILY: Verdana"face="Verdana">    p就是针对行级别的指针,它和&twoArray[1]在同一级别,因此上面代码在判断的时候,如果用</SPAN>
?
1
if(p == twoArray[1])

    则会报错:int (*)[4]与int [4]的间接寻址级别不同。

    因此,对p的解引用操作*p将得到元素级别的指针,第一段程序中q就是这样的指针。

原创粉丝点击