一.常规数组
数组定义:typename arrayName[arraySize](arraySize可以为int值,const值,常量表达式等可以最后确定一个准确的值)(new可以允许是变量)
1.程序不会对数组越界进行提示,所以一定要保证数组下标的有效性
2.sizeof(数组名)得到的是整个数组的长度,sizeof(数组名[i])得到的是单个成员的长度
3.c++11对数组初始化禁止缩窄操作(int->char属于缩窄操作,即数字范围变小的操作)
二.结构数组
结构数组定义:结构中元素为数组,或者,数组中的元素为结构
三.动态数组
用于new运算符来创建动态数组:type_name * pointer_name = new type_name[num_elements];
不能用于sizeof来确定动态分配的数组包含的字节数
动态创建的数组用相应的类型指针去接受它,但是由于指针是变量所以可以修改它的值,修改它的值也就是修改它的指向,但是数组的数组名不能修改。
四.字符串(c-风格字符串 string 类型字符串)
1.c-风格字符串(char数组存储字符,\0表示结尾)
(1)必须包含\0才算是一个字符
(2)字符数组初始化 char bird[11] = “mr ,cc”; 此时引号隐式的包括的结尾的空字符。
(3)在确定存储最短数组时,必须把结尾的空字符计算在里面
(4)字符串拼接 任何两个由空白分隔的字符串常量都将自动拼接成一个。
(5)在数组中使用字符串 存储的方法有两种1.将数组初始化为字符串常量2.将键盘或者文件输入读入到数组中。(strlen()可以计算数组的长度,在cstring头文件中)
(6)sizeof会将数组中的\0计算在内,但是strlen只会计算可见的字符。
(7)cin 有两个缺点:1.当输入有空格,制表符和换行符的时候,cin会自动断开,并且后面部分会存入下一个cin中,造成信息的断裂。2.cin输入时当字符数大于数组最大容量时不会报错。
(8)cin.getline和cin.get解决了cin的缺点:getline(还有一些其他的重载版本)读取一行直到遇到换行符并丢弃换行符。get读取一行直到遇到换行符但是不丢弃换行符。
(9)cin.get(有参),cin.get(无参)有参的形式是将一行传递给目标内存,无参的是跳过读取下一个字符(可用来跳过换行符)。
(10)一般来说,使用get(有参)来读取一行,因为get(有参)输入更加仔细,让人知道是读取到了换行符停止了
(11)当get,getline读取到空行的时候会设置失效位failbit可以用cin.clear恢复输入,当输入字符太长的时候,getline会设置失效位,并关闭后面的输入。
(12)混合输入字符串和数字时,在输入数字后按下换行符会导致字符串无法输入,可以用cin.get()来读取下一位字符。
2.string类字符串(将字符串作为一种数据类型)
(1)string类字符串和字符数组相同的部分为:1.可以使用c-风格的字符串初始化string对象.2.可以使用cin来将键盘输入到string对象。3.可以使用cout来显示string对象。4.可以使用数组表示法开访问string对象中的字符。
(2)一个数组不能赋值另外一个数组,但是string可以,string还可以拼接和附加。
(3)可以使用strcpy()将字符串赋值给字符数组,strcat()将字符串加在字符数组末尾。
(4)string对象.size()输出对象的字符数。
(5)cin,cout 来对string对象进行输入和输出的时候,每次读取的是一行而不是一个单词。
五.指针,数组,指针算术
1.整数变量加1,其值加1,但是将指针变量加一增加的量等于它指向类型的字节数,
2.数组名解释为地址
3.在多数情况下,可以相同的方式使用指针名和数组名。区别之一是指针的值是可以修改的,数组名是常量。区别之二是对数组应用sizeof得到的是数组的长度,但是对指针应用sizeof得到的是单个地址的长度。
4.对数组取地址的时候,传递的是整个数组的地址而不是第一个元素的地址。并且接受的为一个另外一个数组。eg:short(*pos)[20] = &tell;此时(*pos) 与 tell 用法相同。注意short(*pos)[20] 不是一个指针数组。
六.指针和数组小结:
1.声明指针 typeName * pointerName
2.给指针赋值 (1)变量名用&取地址符(2)new运算符返回新创建的内存的地址
3.*对指针进行解引用,但是不可对未赋值的指针进行解引用
4.数组名一般认为是数组中第一个元素的地址,但是在sizeof(数组名)此时返回的是整个数组的长度。
5.指针算术 允许指针+1,加了等于指向数据类型的字节数
6.数组的动态联编和静态联编 int at[20]属于静态联编(在编译时分配空间),int * p = new int [20] 属于动态联编(在运行时分配空间)。
7.数组表示法和指针表示法 使用方括号数组表示法等同于指针解除引用 eg:tacos[0] = * tacos ;
tacos[3] = *(tacos + 3);