声明数组:
typeName arrayNAme [arraySize]
计算机必须在程序执行之前就已经知道数组的大小,因此中括号内只能是一个常量表达式,而不能含有变量。
在初始化数组时,大括号中的值的个数不能大于声明数组的大小,也不能通过添加逗号的方式跳过。但是初始化值的个数可以小于声明数组的大小,此时仅对前面一些有初始化值的元素依次进行初始化。比如:
int array1[3]={0,1,2}; //正确
int array2[3]={0,1,2,3}; //错误,初始化值个数大于数组大小
int array3[3]={0,,2}; //错误,初始化值被跳过
int array4[3]={0,1,}; //错误,初始化值被跳过(即使是最后一个元素,添加逗号也被认为是跳过)
int array5[3]={0,1}; //正确,省略初始化最后一个元素
如果只对数组的一部分进行初始化,则编译器将把其他元素都设置为0 。
可以不在大括号内包含任何东西,这将把所有元素都设置为0。
int array6[3]={0}; //{0,0,0}
int array7[3]={}; //{0,0,0}
int array8[3]={1}; //{1,0,0}
int array9[3];//会是3个任意的数值
在C++中,下标是从0开始的,所以一个大小为n的数组,它的有效下标是0到n-1。
int array[5];
数组所含元素个数: sizeof(array) / sizeof(int);
在计算机里,就好像有许许多多的开关,用导通(开)来表示1,用断开(关)来表示0。当只有一个开关的时候,这个开关能表示两种状态,即0和1;当有两个开关的时候,这两个开关可以表示四种状态,即00、01、10、11……,当有8个开关的时候,可以表示2^8=256种状态,分别是0~255。在计算机中,就是用8个开关(0或1)来表示一个字节(Byte)的,每一个开关(0或1)称为一个“位”(Bit),即8位组成一个字节。把一个字节所能表示的256种状态和256个字符按一定的顺序一一对应起来,一个字节就可以表示256种不同的字符。这种用8位二进制表示一个字符的编码称为ASCII码,它的全称是美国信息交换标准码(America Standard Code for Information Interchange)。需要记住的ASCII码有三个,数字0的ASCII码为十进制的48,大写字母A的ASCII码为十进制的65,小写字母a的ASCII码为十进制的97。
只有在定义数组时才能使用初始化,不能将一个数组赋值给另一个数组。
字符型数组:
空字符( \0 )(实际上是被设置为0的字节)
“S”是字符串常量(使用双引号),表示的是两个字符(字符S和\0)组成的字符串。
(实际上表示的是字符串的第一个元素所在的内存地址)
‘S’是字符常量(使用单引号),在ASCII系统上,表示的是83。
cin使用空白(空格,制表符(Tab)和换行符)来确定字符串的结束位置。
getline()函数读取整行,通过换行符来确定输入结尾,但不保存换行符;在存储时,用空字符来替换换行符。(getline(cin,str); )
get()函数读取整行,但并不丢弃换行符,而是将其留在输入队列中,因此如果不借助于帮助,get()奖不能跨过换行符。
可用不带任何参数的cin.get()调用可读取的下一个字符(即便是换行符),因此可以用它来处理换行符,为读取下一行输入做好准备。
charc1[20],c2[20];
cin.get(c1,20);
cin.get();
cin.get(c2,20);
注意:getline()使用起来简单一些,但get()使得检查错误更简单些。
头文件cstring:
strlen()函数计算可见字符的长度(不把空字符计算在内)
strcpy()函数可将字符串复制到字符数组中
strcat()函数可将字符串附加到字符数组末尾
向函数传递数组:
int max(int [],int); //函数的声明
int max(int a[],int size) //函数的定义(数组的名称 +数组含有元素的数目 )
{
//
}
为什么不在函数里面用sizeof算出数组的大小,而非要在函数外面计算好了,再作为参数传递给函数呢?
参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址(如果在函数中,用sizeof计算数组的大小,得到的是一个元素的大小),函数在需要用到后面元素时再按照这个地址和数组下标去查找(因此在函数中改变数组中的数值,就是直接对数组进行操作)。因为后面的元素根本没进入函数,所以在函数里求不出数组的大小。
数组名实质上是一个指向数组首元素的指针。也就是说,可以用数组名来初始化一个对应类型的指针。
#include<iostream>
using namespace std;
int main()
{
int a[6]={1,2,3,4,5,6};
int *pt=a;
for(int i=0;i<6;++i)
cout<<a[i]<<pt[i]<<*(pt+i)<<*(a+i)<<endl;
return 0;
}
//运行结果:
//5555
//3333
//4444
//1111
//2222
//6666
根据上面的这段程序,可以知道a[i]、pt[i]、*(pt+i)、*(a+i)都能够访问到数组的元素。所以,上述四者是等价的。虽然数组名是指针,但它是一个指针常量。也就是说,不带下标的数组名不能作为左值。
指针是一种数据类型,所以,我们可以用指针类型来创建一个数组。声明一个指针数组的语句格式是:int* a[10];