多维数组(数组类型,数组指针,数组指针类型)

数组:

  • 概念
    元素类型角度:数组是相同类型的变量的有序集合 测试指针变量占有内存空间大小
    内存角度:联系的一大片内存空间

  • 易忽略的细节
    数组首元素的地址和数组地址是两个不同的概念;
    数组名代表数组首元素的地址,它是个常量;
    数组首元素的地址和数组的地址值相等;

int Myarray100] = {0};
//Myarray是数组首元素地址,Myarray+1  步长是四个字节(sizeof(int))
//&Myarray是整个数组的地址,&Myarray+1 步长是100*sizeof(int) 400个字节
  • 定义数组类型
    类型的本质:固定大小内存块的别名
typedef int (myArrayType) [100];
myArrayType Myarray;
//相当于 int Myarray[100];
  • 数组指针类型
    数组指针变量的定义
char *p[] = {"11111","22222","33333"}   //指针数组,数组内变量类型为指针,注意区分数组指针和指针数组
//方法一
typedef int (myArrayType) [100];
myArrayType *parray01;   //数组指针,定义一个指针变量,指向一个数组
                       //相当于 int (*parray) [100];
int tmparray[100];//相当于一个一级指针
parray = &tmparray;//相当于一个二级指针

//方法二
typedef int (*PArrayType) [100];
PArrayType parray02;

//前两种方法通过类型定义数组指针变量

//方法三
int (*parray03) [100];   //直接定义

多维数组的本质

以二维数组为例:
二维数组名的本质:数组指针,步长为一维的长度;【指向一维数组的指针】(第一行的地址和第一行首元素的地址是重合的)
在这里插入图片描述
a[i][j] ==> (*a+i)[j]

  • 多维数组做函数参数退化案例:
#include "stdafx.h"
#include<iostream>
using namespace std;

void printArray01(int arr[3][5],int row,int column)
{
  int i = 0,j = 0;
  for(i = 0;i < row;i ++)
  {
  	for(j = 0;j < column;j ++)
  	{
  		printf("%d",arr[i][j]);
  	}
  	cout<<endl;
  }
}

void printArray02(int arr[][5],int row,int column)
{
  int i = 0,j = 0;
  for(i = 0;i < row;i ++)
  {
  	for(j = 0;j < column;j ++)
  	{
  		printf("%d",arr[i][j]);
  	}
  	cout<<endl;
  }
}

void printArray(int (*arr)[5],int row,int column)
{
  int i = 0,j = 0;
  for(i = 0;i < row;i ++)
  {
  	for(j = 0;j < column;j ++)
  	{
  		printf("%d",arr[i][j]);
  	}
  	cout<<endl;
  }
}


int _tmain(int argc, _TCHAR* argv[])
{
  int a[3][5];
  int i , j = 0;
  int tmp = 0;
  for (i=0; i<3; i++)
  {
  	for (j=0; j<5; j++)
  	{
  		a[i][j] = tmp ++;
  	}
  }
  int len1 = sizeof(a)/sizeof(a[0][0]);//len = 15
  int len2 = sizeof(a[0])/sizeof(a[0][0]);//len2 = 5
  int row = len1/len2;
  int column = len2;


  printArray(a,row,column);


  return 0;
}

猜你喜欢

转载自blog.csdn.net/Castiellee929/article/details/88822978