第三章:数组知识点和习题答案以及学习感受

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;
					}
				}

猜你喜欢

转载自blog.csdn.net/N1314N/article/details/89259827