1、定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型。
2、字符数组的特殊性:
字符数组有一种额外的初始化形式,我们可以用字符串字面值对此类数组初始化。当使用这种形式时,一定注意字符串字面值的结尾处还有一个空字符。
例子:char a1[] = {‘C’,‘+’,‘+’}; //列表初始化,没有空字符 a1的维度是3
char a2[] = {'C','+','+','\0'}; //列表初始化,含有显示的空字符 a2的维度是4
char a3[] = "C++"; //自动添加表示字符串结束的空字符 a3的维度是4
const char a4[6] = "Daniel"; //错误:没有空间可存放空字符 a4是错误的,尽管字符串字面值“Daniel”看起来只有6个字符,但是数组的大小必须至少是7
3、数组阅读的方法:
由于数组的维度是紧跟被命名的名字的,所以就数组而言,阅读的方法由内向外阅读要比从右向左好。
例子1:试着用由内向外阅读的方式分析下面的语句:
int (*Parray) [10] = &arr;
分析:首先是圆括号括起来的部分,*Parray意味着Parray是个指针,接下来观察右边,可知道Parray是个指向大小为10的数组的指针,最后观察左边,知道数组中包含10个元素。Parray是一个指针,它指向一个int数组,数组中包含10个元素。
例子2:
int (&arrRef)[10] = arr;
分析:(&arrRef)表示arrRef是一个引用,它引用的对象是一个大小为10的数组,数组元素的类型是int
例子3:
int *(&arry)[10]=ptrs; //arry是数组的引用,该数组含有10个指针。
分析:按照由内向外的顺序阅读,首先知道arry 是一个引用,然后观察右边知道,arry引用的对象是一个大小为10的数组,最后观察左边知道,数组的元素类型是指向int的指针。所以arry就是一个含有10个int型指针的数组的引用。
4、数组的知识点整理:
理解复杂数组的声明(难点)
理解方法:从数组的名字开始,由内向外顺序读取,先左后右,左边为类型。
不可以将数组的内容拷贝给其他数组当作初始值,也不能用数组为其他数组赋值。
int a[3] = {0,1,3};
int a1[] = a; //错误
a2 = a; //错误
复杂数组声明的理解
int *a[10]; //a数组含有10个指针整形
int &a[10]; //错误,不存在引用的数组
int (*a)[10]; //a是一个指针,指向一个含有10个整数的数组
int (&a)[10]; //a是一个引用,引用一个含有10个整数的数组
int *(&a)[10]; // a是数组的引用,数组含有十个指针
5、习题:下列数组中元素的值是什么?
string sa [10];
int ia [10];
int main()
{
string sa2[10];
int ia2[10];
}
解析:string不是内置的数据类型,int是内置的数据类型。
sa数组为空。
ia数组含有10个整数,皆为0。
sa2数组为空。
ia2数组含有10个整数,在函数体内,值不确定。
6、相比于vector来说,数组有哪些缺点?
解析: 数组的缺点:数组的大小是确定不变的,不可以向数组中添加元素,丧失了vectoer的灵活性。
7、编写一段程序,定义一个含有10个int 的数组,令每个元素的值就是其下标。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0; i < 10; i++)
{
cout << "a[" << i << "]" << " = " << a[i] << endl;
}
}
注意点:下标要从0开始。
8、将7题中刚刚建立的数组拷贝给另外一个数组。利用vector重写程序,实现类似功能。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
int b[10];
for (int i = 0; i < 10; i++)
{
cout << "a[" << i << "]" << " = " << a[i] << endl;
b[i] = a[i];
cout << "b[" << i << "]" << " = " << b[i] << endl;
}
}
解析:知识点为(1)关于数组的拷贝,不可以将整个数组赋值给另一个数组,只能逐个元素的拷贝;(2)如果利用vector,可以直接将整个vector拷贝给另一个vector。
vector:重新写程序,
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
vector<int> v1(a, a + 10);//vector的赋值并不可以像数组一样方便的用花括号方便的赋值,这里借用了数组来初始化这个vector
vector<int> v2 = v1;
int b[10];
for (int i = 0; i < 10; i++)
{
cout << "a[" << i << "]" << " = " << a[i] << endl;
b[i] = a[i];
cout << "b[" << i << "]" << " = " << b[i] << endl;
cout << "v1[" << i << "]" << " = " << v1[i] << endl;
cout << "v2[" << i << "]" << " = " << v2[i] << endl;
}
}