多维数组与指针

今天在写遍历二维数组的时候,突然思考这个问题,原因在于作内层循环时,对指针和数组理解不到位。

虽然一直都会也写遍历二维数组,但是原先从没有想过这个问题。(逃)


头文件

#ifndef TREBLE_H
#define TREBLE_H
#include<iostream>
typedef int int_array[3];

void DisplayArray1(int(&a)[2][3]);
void DisplayArray2(int(*a)[3]);
void DisplayArray3(int_array *a);
#endif // !TREBLE_H

定义
#include"trebleway.h"

void DisplayArray1(int (&a)[2][3])
{	
	//int apa[3];
	for (int (&apa)[3] : a)
	{
		for (int &a:apa)//范围for,要除最内层都要用引用
		{	
			std::cout << a << ' ';
		}
		std::cout << std::endl;
	}
}

void DisplayArray2(int(*a)[3])
{
	for (int(*pa)[3] = a; pa != a + 2; ++pa)
	{
		for (int *paa = *pa; paa != *pa + 3; ++paa)
		{
			std::cout << *paa << ' ';
		}
		std::cout << std::endl;
	}
}

void DisplayArray3(int_array *a)
{
	for (int_array *pa = &a[0]; pa != a + 2; ++pa)
	{
		for (int *paa = &(*pa)[0]; paa != *pa + 3;++paa)//pArray pa=&a[0];
		{					//等同于pArray pa=a;在用到数组名的时候,
			std::cout << *paa << ' ';    //数组名变成指向数组第一个元素的指针。
		}
		std::cout << std::endl;
	}
}

主函数

#include "trebleway.h"

int main()
{	
	int a[2][3] = { { 1, 2, 3 },
		      { 4, 5, 6 } };

	std::cout << "use displayArray1" << std::endl;
	DisplayArray1(a);
	std::cout << "use displayArray2" << std::endl;
	DisplayArray2(a);
	std::cout << "use displayArray3" << std::endl;
	DisplayArray3(a);
	system("pause");
	return 0;
}

内层循环的变量需要定义成指针,是因为此时的内层变量是一个包含3个元素的数组,但是正如题目所说,此时数组名,会变成指向第一个元素的指针。

所以内层变量需要定义成一个指向整型变量的指针,

int *paa = *pa
之前我有个错误理解,是今天突然出现的,之前没想过。这里为什么不是int*paa=pa;奇怪的觉着把pa看做成立数组名,认为这里用pa是一个指向int 型的指针。

但实际上,pa还是指向一个三个变量的数组的指针。

所以实际上(*pa),才是数组,“相当于”数组名;

然后根据数组名会被当做指向数组第一个元素的指针,*pa被认为是一个指向整型变量的指针。

int *paa = &((*pa)[0])

等同于上面这条代码。


2016.8.7更新

int a[2][3]={1,3,4,5,6,};
int (*pa)[3]=&a[1];//pa 实际上存放的是a[1][0]的地址,但是要注意啊&a[1][0]虽然是一个元素的地址
                    //但是pa本身是有类型的,是一个指向含有三个元素的数组的指针
int *p1=pa;//error:pa和p1的类型不符,即使存放的地址对于p1来说是正确的,
            //但这里本质上还是变量的操作,要满足类型相符
int *p2=*pa;//pa被解引用成数组,但是数组在只出现数组名字的地方被认为是指向第一个元素的指针,
            //,即一个int指针,两边的类型相同。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值