所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。
数组声明和初始化
声明数组的语法格式:数据类型 数组名[ 常量表达式 ];
其中括号是数组的标志,常量表达式规定数组的长度,要获取数组中某个元素的值得语法格式:数组名[下标];
其中下标是0~(数组长度-1)。
数组的初始化语法格式:数组类型 数组名[常量表达式]={初始化值1,初始化值2,.........................初始化值n};
int array1[3]={0,1,2};//正确
int array2[4]={0,1,2};//正确,第四个没有初始化的值为不确定值
int array3[ ]={0,1,2};//正确,可以省略数组大小,系统会自动计算出来
int array4[3]={0,,2};//不能跳过
int array5[3]={0,1,};//不能跳过
int array6[3]={0,1,2,4};//不能超越界限
另外还可以如下初始化
int array0[2];
//array0={0,1};//报错
for (int i = 0; i < 2; i++)
{
array0[i]=i;
}
for (int i = 0; i < 2; i++)
{
cout<<array0[i]<<endl;//取出数组中的元素
}
数组在内存中是由若干个相邻的数组元素按顺序拼接而成的,每个数组元素又是相当于是某数据类型的变量,所以每个数组元素所占的内存空间有他的数据类型决定。在C++中有一个sizeof操作符,可以求出一个数组或一种数据类型在内存中的空间大小,它的用法格式是:sizeof(数组名或数据类型);
int array[]={0,1,2,3,4};
int size=sizeof(array)/sizeof(int);
上面的代码可以算出数组的长度,就是它的元素数,在java中用一个.length;就可以搞定的。
字符char
很多人一直都搞不明白字符到底是个啥,字符就是8位二进制表示一个字符的ASCII码,例如‘0’就是48,二进制就是00110000,'A'就是65,二进制就是01000001,'a'就是65+32=97,二进制就是01011111,这也是char和int可以相互转化的原因,运行下面代码你会恍然大悟
void showChar();
void showChar(){
char c;
for (int i = 0; i < 255; i++)
{
cout<<i<<"->";
c=i;
cout<<c<<" - ";
if(i%10==9){
cout<<endl;
}
}
}
运行结果如下图
字符数组
'a'和"a"的区别就是前者是字符,后者是字符串,外表特征是字符用单引号,字符串用双引号;内部特征是字符串必然有一个结尾符'\0',所以字符串"a"是由'a'和'\0'两个字符组成的。所以运行下面代码你会再一次大彻大悟:
char carray[]={'\0','a','A','0'};
cout<<carray[0]<<endl;
for (int i = 0; i < 4; i++)
{
int show=carray[i];
cout<<show <<endl;
}
运行结果是:空 0 97 65 48
所以说'\0'是转义字符,字符串的结尾,他不显示,就类似于'\n'也是转义字符,是换行的意思。
现在开始说字符数组的事情,字符数组有两种初始化方式,一种是用字符,另一种自然就是字符串了。
char tarr0[]={"hello"};//字符串初始化
char tarr1[]={'h','e','l','l','o','\0'};//字符初始化
char tarr2[]={'h','e','l','l','o'};//字符初始化,没有结尾符
cout<<tarr0<<endl;
cout<<tarr1<<endl;
cout<<tarr2<<endl;//没有结尾符,打印出乱码
向函数传递数组
上一篇博文说过对于基本数据类型来说,参数的传递是将实参的值赋给形参。然而对于数组这种数据类型来说,却是例外的,数组作为形参传递给函数的只是数组首元素的地址,函数在需要用到后面的元素时再按照这个地址和数组下标去查找。也就是说后面的元素根本没有到函数里去,所以函数里求不出数组的大小,只能在函数外计算。由于数组传给函数的是地址,所以这就是前面博文中的“引用”的特殊案例,在函数中对数组的修改会影响到实参:
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
void sort(int a[],int size);
void sort(int a[],int size){
for (int i = 0; i < size; i++)
{
int min=a[i],minj=i;
for (int j = i; j < size; j++)
{
if(min>a[j]){
min=a[j];
minj=j;
}
}
int tmp=a[i];
a[i]=a[minj];
a[minj]=tmp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int array[]={14,2,6,22,8,0,10,8};
int size=sizeof(array)/sizeof(int);
for (int i = 0; i < size; i++)
{
cout<<array[i]<<endl;
}
sort(array,size);
for (int i = 0; i < size; i++)
{
cout<<array[i]<<endl;
}
getchar();
return 0;
}
二维数组
二维数组与是由一维数组组成,二维数组比一位数多一个下标:
int array[2][2]=
{
{ 0, 1 },
{ 2, 3 }
}
初始化方式如下
int arr0[3][2]={1,2,3};
int arr0[][2]={1,2,3};
int arr0[3][2]={{1},{1,2},{2,3}};
需要注意的是二维数组声明时第一个中括号里是行数,第二个值是列数,其中行数可以省略,列数不可以省略。