数组:
-
概念
元素类型角度:数组是相同类型的变量的有序集合 测试指针变量占有内存空间大小
内存角度:联系的一大片内存空间 -
易忽略的细节
数组首元素的地址和数组地址是两个不同的概念;
数组名代表数组首元素的地址,它是个常量;
数组首元素的地址和数组的地址值相等;
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;
}