**
数组
**
仅说书上本节介绍的内容,至于voctor各种用法,这里不提,仅是总结书上内容,查漏补缺用。
声明数组通用格式为:
typename arrayName[arraySize];
例如:
short months[12];
说一下,arraySize必须为整型常数或者整型常量,总之必须为常量,不能为变量。
常见的有的错误:
int sz =10;
short array[sz];
这会报错!有时将sz写在很远处,看不出来。
数组初始化。只有在定义数组是才能使用初始化,以后就就不能使用了,也不能将数组赋值给另外一个数组。
int cards[4] = {1,2,3,4}; //可以,没毛病
int hand[4];
hand[4] = {1,2,3,4}; //错误!!!
{}初始化列表,如下两种都可以:
double balances[10] = {};//所有元素置为0
double counts[20] {};//所有元素置为0
字符串。
C风格的字符串,以空字符结尾,空字符写为\0,ASIC码为0.
char bird[11] = "mr.cheeps";
char fish[] = "bubble";
两种方式都可以,第一种最好是个数对应好,赋值少了的话,剩余的会全是\0,多了的话会截断。第二种比较靠谱。时刻记住C风格字符串末尾有个\0.
cin.getline()函数读取输入整行。
char name[20];
cin.getline(name, 20);
第二个参数表示最多读取20个字符,另外读取遇到换行的话,换行符被从输入流中读出,然后自动将换行替换成\0,结束输入。
与之对应的是cin.get()函数:
cin.get(name, 20);
cin.get();
它读到换行后,换行留在输入流中,自己添加字符串需要的\0。
所以连续输入时,需要加上cin.get();读取输入流中的一个字符,将换行读取走,以免影响后续的语句在输入流中读到上次剩下的无用的换行。简单的方法是将他们串起来:
cin.get(name, 20).get();
复杂的花式输入输出,后续介绍。
string类型字符串
包含string后,就可以使用string来定义字符串了。string类位于std中。
string a ;//空字符串
string b = “hehe”//常规初始化赋值,并且不会限制长度
赋值,a=b是允许的。
合并用+号就可以了,a+=b;
取得长度 a.size();
最后说一下string头文件和cstring头文件,
string是C++新定义个头文件,包含新定义的string类,也就是说要用string类型,必须包含string,并且std::string 。
cstring由前面的c可以看出是C遗留过来的,里面是C风格数组字符串的一些操作,比如用于赋值的strcpy(),用于拼接的strcat(),用于返回数组字符串长度的strlen()等等,反正一堆C字符串的操作都在里面,看着就头大。
还是多用string是王道。
**
结构
**
就是个小类。
struct student
{
string name;
int age;
};
构造并初始化。
student james;//可以留空,自动默认成员都为0
student kobe {"kobe", 32};//也可以直接赋值
**
枚举
**
构造:
enum weekdays{monday, tuesday, wednesday, thursday, friday};
用法:
weekdays day = monday;
枚举其实就是为一些常量提供了符号。例如上面默认的,数字0,1,2,3,4分别用符号monday, tuesday, wednesday, thursday, friday来表示。
也可以单独设置枚举量的值:
enum weekdays{monday=10, tuesday=20, wednesday=30, thursday=40, friday=50};
也可以只指定一部分:
enum weekdays{monday=10, tuesday, wednesday=30, thursday=40, friday};
这里有个规则就是后面的比前面的加1.例如Tuesday就是11,Friday就是41。
也可以有相同值:
enum weekdays{monday, tuesday=0, wednesday, thursday=1, friday};
这里Monday就和Tuesday一样为0,wednesday就和Thursday一样为1。不知道这种玩法有啥用。。。。。。
**
指针
**
直说一点:
int a = 5;
int* ptr = &a;
虽然*靠哪边都无所谓,但是这种形式比叫好看。
ptr表示地址,*ptr表示解引用的变量
&a表示地址,a表示变量
so。。。ptr与&a完全等价、*ptr与a完全等价。
在指针解引用之前,一定要初始化为一个正确的地址!!!!
double fellow;
cout<<*fellow<<endl;//这个错误还能挽回,它只是读取了一个不知道位置的数据,因为fellow可能指向任意随机一个位置
*fellow = 35.0;//这个就比较致命了,因为将35写进了一个你不知道的地方,那个地方都有可能,所以会导致莫名其妙错误。
new 、delete
int* ptr = new int;
...
delete ptr;
delete只能释放由new分配的内存,本身指向变量地址的那种指针,不能delete:
int a = 5;
int* ptr = &a;
delete ptr;//错误!!!
也就是说delete要跟new成对出现。
new数组:
int* psome = new int[10];
...
delete [] psome;
三注意:
1、new 与 delete、new[]与delete[]成对出现!
2、不delete同一块内存两次!
3、delete 空指针是可以的!
将常量字符串赋值给指针时,一定要是const指针:
const char* ptr = "china";//必须要const才可以,不然报错
这点要注意。
C形式字符串数组在初始化时,可以用=,其余必须用strcpy()等操作函数。
char arr1[] = "china";//OK,没问题
char arr2[];
arr2 = "china";//极端错误!
strcpy(arr2, "china");//这样才可以。
明白能用string就用string了吧!