指向二维数组的指针

本文深入探讨了C++ Primer第四章中关于二维数组和指针的概念,特别是如何通过定义指向一维数组的指针来访问二维数组,并解释了(*p)[4]与*p[4]的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

    在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>
using namespace std;
int main()
{
    int twoArray[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;
    }
    return 0;
}

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

(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()
{
    int twoArray[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;
    }
    return 0;
}
?
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就是这样的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值