多维数组与指针

来源:互联网 发布:sunny crown 人工智能 编辑:程序博客网 时间:2024/05/17 04:46

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

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


头文件

#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
原创粉丝点击