1. 数组Ⅰ
数组是聚合数据类型, 通过数组名和索引,访问多个相同类型的变量。
数组访问通过中括号和索引表示变量,索引通常从0开始;
数组的索引可以是非常量整型值,但数组的长度必须是常量整型值;
数组变量的类型可以为任何类型,包括基本数据类型和结构体;
2. 数组Ⅱ
1)数组初始化,可以通过括号对每个变量进行赋初值,亦可以一个个赋值;并且可以部分赋值:
2)省略数组长度
括号赋值,可以省略数组的长度,默认赋值的个数为数组的长度;
可以通过sizeof求数组的个数:
3)数组与枚举:
数组的长度和访问索引可以通过枚举来表示:
3. 数组与for循环
数组最常和for循环打交道,如:
通常操作,包括查找值(最大、最小)、计算值(平均、总和)和重排列(从大到小、从小到大)
注意:越界问题,应谨慎。
4. 使用选择排列法重排数组
选择排列法:从0位开始,查找最小值,然后与0位交换;然后在从1位开始,查找最小值,与1位交换;依次迭代。
5. 多维数组
可以声明多维数组,可以括号赋初值;对于二维,第二维是忽略的,可以省略第一维个数,但不能两者都省略;可以统一赋初值为0,但注意维长度。
通常访问二维数组,使用2个变量,一个是行索引,一个是列索引;
可以使用多重循环,访问二维数组;
6. C 形字符串
1)之前的cout可以输出字符串:
在C和C++中,字符串看作是字符数组,字符数组以结束符号'\0'结束,即ASCI码的0。
就如通常的数组一样,字符数组一旦声明,其长度是不可改变的;
可以使用[]来单独改变某个字符;
字符数组,遵从数组的所有规则,如:
2)缓冲和缓冲溢出
当输入的字符个数超过字符组的长度,就会产生缓冲溢出;通常需要保证缓冲的足够大小;
一般这样的输入,空格作为结束输入标志,通过以下方法,可以输入包括空格:
3)字符串操作
包括复制、连接、比较和求长度。
strcpy(dstStr,srcStr) ;//覆盖
strcat(dstStr,srcStr) ;//直接在dstStr后面加上srcStr,会出现溢出异常
strncat(dstStr,srcStr,n);//只复制srcStr的前n个字符加到dstStr,会检查缓冲大小
strcmp(str1,str2);//如果相等,返回0
strncmp(str1,str2,n);//比较前n个
strlen(str);//获取字符串长度
4)标准字符串
std::sring
可以通过getline来获取包括空格是输入:
7. 指针介绍
1)指针-承载其他变量的地址。
例如:
星号置于类型和指针名称之间,就是声明了一个指针变量;至于星号偏向哪边,都可以,每个人都有自己的习惯;星号不属于指针变量的名称。
赋值给指针变量,值必须是地址;可以使用取地址运算符-&来获取:可以理解为指向/取地址
指针变量的类型必须匹配执行的变量类型:
2)解引用指针
指针指向的是一个地址,另一个通常的做法是取该地址的值,使用-*来获取指针指向的值;
所以,pnPtr等同于&nValue,而*pnPtr等同于nValue ;
给*pnPtr赋值,就如同给nValue赋值:
此外,指针是可以改变指向其他变量的。
3)空指针
空指针-不指向任何变量的指针,默认地址为0;
在C语言中,空指针是为NULL,如:
空指针通常出现在条件语句中;
空指针通常使用在动态内存分配中。
4)指针的大小(字节数)
指针指向的是CPU存储器的地址,字节数依赖于CPU机器,通常是一样的;如32的CPU,指针为32位;而64位的CPU,指针则为64位。
可以通过sizeof(指针名)来获取指针的字节数:
8. 指针、数组和指针运算
在数组中,数组名实质就是执行数组第一个元素的指针:
2)指针运算
在C语言中,允许对指针进行加法和减法的运算;
pnPtr+1,只是将指针指向内存中的下一个地址;并且,返回的不是当前地址的下一个地址,而是当前类型之后的下一个对象的地址;
如pnPtr+3,若当前是32位的,整型数为4个字节,则运算后的地址是12个字节后的地址;
如:
多数的用法是++,在数组中,循环访问数组;
3)指针运算访问数组
因为*比+有更高的优先级,所以注意要加括号来确定;
如:
9. 使用new和delete进行动态内存分配
通常,动态确定数组的长度是有很大意义的,可以有效利用空间;
2)动态为单个变量分配内存空间
3)动态为数组分配内存空间
4)内存泄漏
动态的内存直到程序结束或显式释放,才执行回收;
如果动态分配了,而没有显式回收释放内存;则该内存依然为程序所占据,这样就造成了内存泄漏;
程序占据自由的内存空间。
5)空指针Ⅱ
空指针,亦可以理解为-还没分配内存。
可以通过判断指针是否为空指针,再而确定分配内存;
通常最好的习惯是,没有赋值的指针都设为空指针:
10. 指针和常量
就如其他变量一样,指针亦可以声明为常量;指针和常量比较容易混淆;使用关键字const。
1)const在*和指针变量名称之间:常量指针在声明时指向一个的地址,并且它的值不可变的;
2)const位于类型之前,这样指针变量就为常量,不能改变其指向:
但是,指向的是非常量指针时,可以重新指向:
3)常量指针指向一个常量值时,2者都不可以改变:
常量指针常用于传递给函数的参数中。
11. 引用
引用,即其他变量的别名;意为引用于……;使用关键字&
那么&nValue等同于&rnRef。
声明引用时,必须赋值;其后不能不能重新引用其他;
2)常量引用,不能改变引用的值
3)引用的2个典型应用:函数传参,防止修改参数的相关值;易访问层层里面的值。
12. 引用、指针和成员选择
1)引用和指针
一个引用就如一个常量指针的解引用;
一个常量引用,就如一个常量指针指向一个常量值;
因为引用只能为合法的内存,所以较指针安全;
2)成员选择
成员选择,如结构体可以通过'.'来访问成员,
因.的优先级比*高,所以必须加括号;
此外,C++为指针变量提供了->来访问成员。
13. void指针
void指针,即通常所说的泛型指针;可以指向任何数据类型;
注意:因为void指针预先不清楚其类型,所以不能通过*来解引用,必须在显式转换之后才可以访问:
除非必须,否则尽量避免void指针。