1.数组的特点: 1)数组中的每个元素具有相同的类型;
2)每个元素由“下标”唯一标示;
3)使用连续内存空间;
4)数组的下标从0开始。
2.一维数组的内存结构图:
2.注意数组访问时不能越界!
3.一维数组初始化时应该注意四点:
1)初始化时,可以对全部元素赋初值,也可以对部分元素赋初值;
2)如果只对部分元素赋初值,没有赋初值的元素默认为0;
3)若对所有元素赋初值,可以不显示指定数组的长度,系统会根据初值表中数据的个数自动定义数组的长度;
4)在定义数组时,编译器必须知道数组的大小。因此,只有在初始化的数组定义中才能省略数组的大小。
5.用sizeof函数计算数组中的元素个数代码如下:
void main()
{
int iArray[4] = { 0, 1, 2, 3 };
int iSize = sizeof(iArray) / sizeof(iArray[0]);
for ( int i=0 ; i<iSize ; ++i )
{
cout<<iArray[i]<<endl;
}
system("pause");
}
6.使用字符数组应该注意:
1)如果字符个数大于数组长度,系统会提示用户语法错误;
2)用字符串初始化字符数组时,系统会在字符数组的末尾自动加上一个字符'\0'。因此,要考虑数组的长度比实际字符的个数大1;
3)用字符串初始化一维字符数组时,可以省略大括号{}。
4)输出字符数组时会自动输出到\0结束(比较特殊!!)。
7.数组名字也可以作为整个数组的首地址。
8.不能分配大小为0的数组。
9.代码如下:
#include <iostream>
using namespace std;
//定义了一个“宏”
#define ArrayLength 10
void main()
{
//--------2015.4.7 一维数组--------
//一维数组:具有1个下标的数组
const int c_iArraySize = 5;
int iArray1[c_iArraySize+3]; //声明一个整型数组iArray1,它有5个元素,下标分别为0-4
float fArray1[c_iArraySize];
char cArray1[ArrayLength+6];
//数组元素的访问方式:数组名[下标]
//cout<<"iArray1[0] = "<<iArray1[0]<<endl;//反例:报运行时错误,没有初始化的情况下就使用了该数组元素
int iArray2[c_iArraySize] = {},iArray3[c_iArraySize+ArrayLength];
//数组的初始化方式1:全都初始化
int iArray4[5] = {1,2,3,4,5};
//循环输出数组元素
for(int i = 0 ; i < 5 ; ++i)
{
cout<<"iArray4["<<i<<"]="<<iArray4[i]<<endl;
}
int iIndex = 0;
cout<<iArray4[iIndex++]<<endl;//输出 1 ,iIndex为 1
cout<<iIndex<<endl;
cout<<iArray4[++iIndex]<<endl;//输出 3 ,iIndex为 2
cout<<iIndex<<endl;
注意:double到float警告
//float fArray2[5] = {1.2,2.2,3.2,4.2,5.2};
//数组的初始化方式2:部分初始化
int iArray5[10] = {1,3,5,7,9};
for(int i = 0 ; i < 10 ; ++i)
{
cout<<"iArray5["<<i<<"]="<<iArray5[i]<<endl;
}
直接输出数组名:得到整个数组的"首地址"
//cout<<iArray5<<endl;
//数组的初始化方式3:在没有明确给出数组长度的情况下,默认为全都初始化
int iArray6[] = {2,4,6,8,10};
int iLength = 0; //数组长度
//对数组名进行sizeof操作,得到数组的总字节数
int iArrayBytes = sizeof(iArray6);
iLength = iArrayBytes / sizeof(iArray6[4]);
for( int i = 0 ; i < iLength ; ++i )
{
cout<<"iArray6["<<i<<"]="<<iArray6[i]<<endl;
}
//cout<<iArray6[5]<<endl;//反例:访问越界
//int iArray7[0] = {};//反例:不能分配大小为0的数组
//int iArray8[] = {};//反例:不能分配大小为0的数组
//-----数组的动态初始化:在声明数组后再为数组元素赋值-----
int iArray9[5];
for(int i = 0 ; i < 5 ; ++i)
{
iArray9[i] = (i+1)*10 + 1;
}
for(int i = 0 ; i < 5 ; ++i)
{
cout<<"iArray9["<<i<<"]="<<iArray9[i]<<endl;
}
//------------字符数组------------
char cArray2[10] = {'H','e','l','l','o','W','o','r','l','d'};
for( int i = 0 ; i < 10 ; ++i )
{
cout<<"cArray2["<<i<<"]="<<cArray2[i]<<endl;
}
cout<<cArray2<<endl; //特殊形式:没有\0结束符
char cArray3[10] = { 'H' };
for( int i = 0 ; i < 10 ; ++i )
{
cout<<cArray3[i]<<endl;
}
char cArray4[11] = {"HelloWorld"};
for( int i = 0 ; i < 10 ; ++i )
{
cout<<cArray4[i];
}
cout<<endl;
char cArray5[10] = "HelloC++";
for( int i = 0 ; i < 10 ; ++i )
{
cout<<cArray5[i];
}
cout<<endl;
//字符数组特殊输出方式:
char cArray6[20] = "Hello\0World C++";
cout<<&cArray6<<endl;
//键盘输入一个字符数组
char cArray7[30] = {};
cout<<"请输入字符串:";
cin>>cArray7;
cout<<cArray7<<endl;
system("pause");
}
10.二维数组赋值方式有两种:
1)按行分段赋值int iArray[3][4]={
{1,2,3,4},
{3,4,5,6},
{5,6,7,8}
};
2)按行连续赋值int iArray[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 };
11.对全部元素赋初值,则第一维的长度可以不给出.
12.多维数组道理同二维数组,如下为一个三维数组:
int iArray[2][3][4] =
{
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
},
{
{101,102,103,104},
{105,106,107,108},
{109,110,111,112}
},
};
13.代码如下:
#include <iostream>
using namespace std;
#include <iomanip>
void main()
{
// 声明一个二维数组
int iArray1[5][5];
// 定义一个二维数组,全都初始化
int iArray2[5][5] =
{
{ 11 , 12 , 13 , 14 , 15 },
{ 21 , 22 , 23 , 24 , 25 },
{ 31 , 32 , 33 , 34 , 35 },
{ 41 , 42 , 43 , 44 , 45 },
{ 51 , 52 , 53 , 54 , 55 }
};
// 对二维数组的元素逐个进行访问,通过嵌套的for循环
for( int i = 0 ; i < 5 ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
{
cout<<iArray2[i][j]<<" ";
}
cout<<endl;
}
//定义一个二维数组,进行部分初始化
int iArray3[5][5] = {};
for( int i = 0 ; i < 5 ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
cout<<iArray3[i][j]<<" ";
cout<<endl;
}
//定义一个二维数组,进行部分初始化
int iArray4[5][5] = {1,2,3,4,5,6};
for( int i = 0 ; i < 5 ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
cout<<iArray4[i][j]<<" ";
cout<<endl;
}
//定义一个二维数组,进行部分初始化
int iArray5[5][5] = {{1},{2,3},{4},{5},{6}};
for( int i = 0 ; i < 5 ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
cout<<iArray5[i][j]<<" ";
cout<<endl;
}
//定义一个二维数组,进行部分初始化
//当我们对二维数组进行初始化赋值的时候,行可以不明确给出
//系统会自动根据列数及初始值的个数,计算行数
cout<<"--------------------"<<endl;
int iArray6[][5] = {{1,2},{3,4,5},6};
for( int i = 0 ; i < sizeof(iArray6) / (5*sizeof(int)) ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
cout<<iArray6[i][j]<<" ";
cout<<endl;
}
cout<<"--------------------"<<endl;
//动态初始化二维数组
int iArray7[5][5] = {};
for( int i = 0 ; i < 5 ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
{
iArray7[i][j] = (i+1)*10 + j+1;
}
}
for( int i = 0 ; i < 5 ; ++i )
{
for( int j = 0 ; j < 5 ; ++j )
cout<<iArray7[i][j]<<" ";
cout<<endl;
}
int iArray8[10][10] = {};
for( int i = 0 ; i < 10 ; ++i )
{
for( int j = 0 ; j < 10 ; ++j )
{
iArray8[i][j] = i*j;
cout<<setw(3)<<iArray8[i][j]<<" ";
}
cout<<endl;
}
//二维可以被看成是一维数组的数组
int iArray9[3][4] =
{
{11,12,13,14},
{21,22,23,24},
{31,32,33,34},
};
//二维字符数组
char cTemp[20] = "hello" ;
cout<<cTemp<<endl;
char cArray1[3][20] = { "Today","is","Good" };
for(int i = 0 ; i < 3 ; ++i)
{
cout<<cArray1[i]<<endl;
}
cout<<"二维字符数组的首地址:"<<cArray1<<endl;
system("pause");
}
13.如果不给数组赋初始值则数组中存的均为错误的数据,如下图:
14.二维数组的存储结构:
15.因为静态二维数组内存连续,所以可以单纯的用一个指针去访问数组里面的元素。