指向二维数组的指针

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

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

#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]是同一个地址。但是他们表示的级别是不同的,因此不能混用。

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;
}
  twoArray[1]和&twoArray[1]输出的内容是相同的,都是第1行的首地址,但是他们的含义是不同的,twoArray[1]

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

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

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

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

原文链接: https://www.cnblogs.com/kadinzhu/archive/2011/05/08/2040541.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    指向二维数组的指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/25149

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午3:00
下一篇 2023年2月8日 上午3:01

相关推荐