C++学习第7篇-数组和指针

来源:互联网 发布:拍照软件哪个好 编辑:程序博客网 时间:2024/06/02 06:27

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指针。


【免责特此声明:
1)本内容可能是来自互联网的,或经过本人整理的,仅仅代表了互联网和个人的意见和看法!
2)本内容仅仅提供参考,任何参考该内容造成任何的后果,均与原创作者和本博客作者无关!】

原创粉丝点击