C++指针和数组 目录: 3、数组与指针 4、指针的潜在危险 “ 3.数组与指针 3.1一维数组与指针 定义指针变量指向数组首素,以指针变量名代替数组名,实现数组操作。(指针所指位置不变) 指针变量从前到后依次指向数组各素,通过指针的取内容运算得到对应素。(指针所指位置不断变化) 例:用下列数据初始化一维数组,并通过指针变量求素的最大值。 8.2 6.5 3 9.7 12 2.8 7.6 15 10.3 定义实型指针p指向数组b的首素,max 表示最大值; 以p 代替b,通过循环语句输出数组的各素; 指针p 从第二个素开始遍历数组,遍历过程中将比max 大的素赋给max。 l指针变量只能代表其所指向的数组。当指针不再指向数组的首素时,不能代表原数组。 3.2二维数组与指针 3.2.1素指针与行指针 指向素的指针简称素指针。(指向素) 二维数组素指针与一维数组素指针的定义方式相同,使用方法相似。如: 行指针定义: 指向二维数组某行的指针简称行指针。(指向一行) 二维数组数组名b 是b[0]的地址(&b[0]),b[0]是二维数组的第一行,即b是指向二维数组第1行的行指针;且b[0]是由5 个素组成的一维数组,故行指针也称为指向一维数组的指针。 数据类型与所指向的二维数组的数据类型相同; 下标为二维数组的列数,通常为整型常量表达式; 必须用“()”将指针变量名括起来。 如: 二维数组行地址、素地址和素之间的关系 对行地址进行取值运算可以得到素地址; 对素地址进行取值运算可得到二维数组的素。 分类表示方法备注行指针p2+i,&p2[i]下标为i行的行地址素指针*(p2+i)+j,p2[i]+j下标为i行j列的素地址素* (* (p2+i)+j),*(p2[i]+j),p2[i] [j]下标为i行j列的素 3.2.2素指针使用二维数组 将二维数组作为一个行数×列数的一维数组 定义素指针指向二维数组的第一行第一列素; 一维数组名为指针变量名; 一维数组大小为二维数组的行数×列数。 3.2.3行指针使用二维数组 定义行指针指向二维数组的首行 行指针变量名代替二维数组名,实现二维数组的操作; 行指针取值运算得到素地址,然后素地址取值运算得到素,完成对二维数组的操作。 注意素指针与行指针使用的区别,指针所指的位置。 例:通过指针输出下列二维数组,并求各素的和。 2 3 1 4 10 6 2 5 8 3 7 8 9 6 12 行指针p1:&b[0];p1+1:&b[1] 素指针p2:&b[0] [0];p2+1:&b[0] [1] 3.2.4字符数组与指针 字符型指针变量指向字符串 定义时用字符串对其初始化; (1)用字符串对指针变量赋值。 如: (2)直接引用字符型指针变量所指的字符数组 结合前面讲过的二级指针,我们来看看使用的实例。 例:设计一个程序,将字符串中的字符逆序。如将“I am a student.”逆序为“.tneduts a ma I”。 数组str 存储字符串,指针s1 指向首素,s2 指向尾素。 当s1在s2前面时,将s1 和s2 所指的素互换;然后s1 后移一个素,s2 前移一个素。 指针使用数组 搞清指针所指位置 分清操作对象是指针本身还是指针所指内存空间 分清所使用的是素指针还是行指针 充分理解指针的含义:地址;代表所指向的数组。 3.2.5指针数组 各素为指针变量的数组。 普通数组中存储的是普通数据(数值),指针数组中存储的是地址。 定义: 如: 4.指针的潜在危险 指针的让我们对内存的操作有了很大的自由性,同时也带来了潜在的危险。 4.1产生的原因: 1.定义指针变量的同时未对其进行初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会指向随机区域,因为任何指针变量(除了static修饰的指针变量)在被定义的时候是不会被置空的,它的默认值是随机的。 2.指针所指向的内存空间被释放时,却没有对该指针变量的值(即该指针原来指向的内存空间的地址)进行置空:我们在用库函数malloc开辟内存空间时,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()或者delete(注意delete只是一个操作符,而free()是一个函数)释放后,如果程序员没有对其置空或者其他的赋值操作,就会使其成为一个野指针。 3.指针操作超越变量作用域. 4.2危害: 上述问题在于,指针指向的内存空间已经无效了,而该指针变量的值(即该指针原来指向的内存空间的地址)没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致段错误,野指针很难定位到是哪里出现的问题,在哪里这个指针就失效了,不好查找出错的原因。所以调试起来会很麻烦,有时候会需要很长的时间。 4.3规避的方法: 1.在定义一个指针时同时初始化为NULL; 2.释放指针指向的内存空间时,将指针重置为NULL。 3.使用时不要超出变量作用域,如使用数组时:
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/69926.html