版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础第7章指针目
录7.1
初识指针7.1.1
内存地址7.1.2
指针的概念7.2
指针变量7.2.1指针变量的定义和初始化7.2.2指针变量的引用7.3
指针与数组7.3.1指向一维数组的指针7.3.2指向二维数组的指针7.3.3指针数组7.4
指针与字符串7.4.1定义指向字符串的指针7.4.2字符数组作函数参数7.4.3使用字符指针变量和字符数组的比较7.5
指针与函数7.5.1使用指针实现参数传递7.5.2动态内存分配7.5.3使用数组指针作为函数参数7.6
指向指针的指针本章小结7.1.1内存地址计算机程序运行时,所有的数据必须存在于内存中。CPU访问内存实际访问的是----内存地址。编译和链接过程的重要任务就是找到变量/函数所对应的内存地址。不同类型的数据占用的内存字节数目不同。内存中所有地址(字节)编号----内存地址(或者:指针)例程7-1----输出一个内存地址运行结果7.1.2指针的概念内存单元的地址就叫做指针。用变量来存放指针,就成为指针变量。在同一CPU架构下,不同类型的指针变量所占用的存储单元长度相同。32位系统指针大小为4字节;64位系统指针大小为8字节指针不仅可以对数据本身,还可以对存储数据的变量地址来进行操作。例程7-2----简单指针定义运行结果7.2.1指针变量的定义与初始化指针变量的定义变量类型定义为指针类型;指针变量名、指针变量所指向的变量的数据类型。定义语句的基本格式:“*”表示这是一个指针变量;“指针类型标识符”表示这个指针变量指向的变量的数据类型。也可以一次定义多个指针变量:注意:原则上一个指针变量只能指向同类型的变量。(如果做了强制类型转换,编译不会提示错误,但是运行时可能出现结果错误)7.2.1指针变量的定义与初始化野指针:指针变量没有初始化,系统为其分配内存,是不确定的内容,指向不确定的地址,称为野指针。指针变量的初始化指针变量需要进行初始化赋值后才能使用;C语言中,变量的地址是由编译系统分配的,对用户完全透明。提供了地址运算符“&”来表示变量的地址如:&a表示变量a的地址。一段代码:指针变量的初始化和赋值例程7-3----指针变量的定义与初始化运行结果7.2.2指针变量的引用指针变量和相关运算符地址运算符&:单目运算符;功能是取变量的地址,运算结合性为自右向左。指针内容运算符*:也称为解引用运算符。单目运算符,运算结合性自右向左。用来表示指针变量所指向的变量。在“*”运算符之后跟的变量必须是指针变量。指针变量的初始化指针变量需要进行初始化赋值后才能使用;C语言中,变量的地址是由编译系统分配的,对用户完全透明。提供了地址运算符“&”来表示变量的地址如:&a表示变量a的地址。例程7-4----指针运算符的应用运行结果例程7-5----指针修改变量的值运行结果7.2.2指针变量的引用指针的算术运算指针加上(或减去)一个整数n表示:加上(或减去)n个指针的类型的大小(不是相差的字节数)和数据类型有关。例程7-6----指针的算术运算运行结果例程7-6----指针的算术运算运行结果7.2.2指针变量的引用指针的关系运算指针可以比较大小,比较的是存储的地址值的大小。如果地址相等,那么两个指针就指向内存中的同一个数据,否则就指向不同的数据。指针的赋值运算指针变量初始化赋值把一个变量的地址赋给指向相同数据类型的指针变量把一个指针变量的值赋给指向相同类型变量的另一个指针变量把数组的首地址赋给数组的指针变量把字符串的首地址赋给指向字符类型的指针变量把函数的入口地址赋给指向函数的指针变量7.3.1指向一维数组的指针数组名本身就是一个指针,指向数组首地址,即第一个元素的地址。数组名就可以认为是一个指针,它指向数组的第一个元素(下标为0)数组中所有的元素在内存中连续排列存储。指向一维数组的指针将数组名a赋值给指针变量p,p就指向a的第一个元素的地址。在指针已经指向一个数组元素时,可以做以下运算:①加一个整数(p+i),如p+=1;②减一个整数(p-i),如p-=1;③自加运算,如p++;④自减运算,如p--;⑤指针相减,如p1-p2(只有p1和p2都指向同一个数组中的元素时才有意义)。例程7-7----通过指针访问数组元素运行结果例程7-8----指针输出整型数组的值运行结果7.3.2指向二维数组的指针二维数组虽然有行和列,但在内存中所有的数组元素都是连续排列的。二维数组可以理解为矩阵,但是实际上在内存的存储是按照一维线性排列的。如,定义:实际内存排列为:二维数组可以分解成多个一维数组进行处理。例程7-9----使用指向遍历二维数组运行结果例程7-10----指针数组(存放指针的数组)简单应用运行结果例程7-10----指针数组(存放指针的数组)简单应用运行结果7.4.1定义指向字符串的指针C语言中没有特定的字符串类型。通常把字符串放在字符串放在一个字符数组中,就可以通过指针访问字符串。引用/使用一个字符串使用字符数组---通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明“%s”输出该字符串。使用字符指针----用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。例程7-11----使用指针指向字符串并遍历运行结果7.4.2字符指针作函数参数字符指针作为函数参数----地址传递。使用字符数组名字作为参数;使用字符指针变量作为函数参数。例程7-12----使用字符指针实现字符数组复制运行结果7.4.3使用字符指针变量和字符数组的比较(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),不是将字符串放到字符指针变量中。(2)初识化和赋值方式不同。字符数组可以在定义时对各元素赋初值,但不能用赋值语句对字符数组中全部元素整体赋值。可以对字符指针变量赋值,但不能对字符数组名赋值。(3)存储单元的分配。程序编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(VisualC++为指针变量分配4个字节)。如果定义了字符数组,但未对它赋值,这时数组中的元素的值是不可预料的。可以使用(如输出)这些值,但结果显然是无意义的。(4)指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。(5)字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能再赋值)。7.5.1使用指针实现参数传递C语言中,函数参数传递默认为值传递(函数中的形参是实参的拷贝)对形参的修改不会影响到实参。使用指针作为函数的参数传递,可以实现对实参的修改。例程7-13----使用指针实现两个整数值的互换运行结果7.5.2动态内存分配在C语言中,可以通过malloc()函数来动态地分配内存空间。malloc函数的返回值是一个void类型的指针,可以将其强制转换为需要的数据类型的指针。动态地分配了10个int类型的内存空间,并将其地址赋值给指针变量p。需要注意:使用完动态分配的内存空间后,需要使用free()函数来释放这些空间,否则会造成内存泄漏。7.5.3使用数组指针作为函数参数例程7-14----使用数组作为函数形参,指针作为实参,实现数组元素倒序排列(选择排序)运行结果例程7-14----使用数组作为函数形参,指针作为实参,实现数组元素倒序排列(选择排序)运行结果修改----使用指针作为形参例程7-15----获取整数数组中的最大值运行结果7.6指向指针的指针如果一个指针变量存放的是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。通过指针访问变量称为间接访问。指针变量直接指向变量,称为“单级间址”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”,也就是说,形成了一个指针链。当定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。如图所示。指向指针的指针变量声明格式如下:例程7-16----使用指向指针的指针输出变量的值运行结果本章小结“指针”是C语言中一个形象化的名词,表示一种“指向”的关系,其实现通过地址的访问来完成。“指针就是地址”本章主要学习指针变量的概念与应用。通过实例程序学习指针与数组、指针与字符串、指针与函数之间的关系和基本应用。在C语言程序设计中使用指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重阳节主题班会教案
- 电力应急培训试题和答案
- 高级冲压工岗位技能考核题及答案
- 跌倒坠床应急预案试题(附答案)
- 防渗漏专项方案
- 防汛安全试题及答案
- 导管脱落试题及答案
- 村集体经济年终总结
- 大象版五年级上册科学知识点总结
- 成人脑卒中患者运动康复循证实践指南总结2026
- 塔吊安拆工程监理实施细则
- 2026年银行客户经理等级考试必考题库及答案
- T∕CSICE 061-2026 混合动力总成耐久性试验方法
- 初中物理八年级下册《摩擦力》教学设计
- 数学五上综合实践《小小设计师》大单元教学设计(北师大2027新教材)
- 2026年湖南中考语文试卷及答案解析
- (2026年版)中国有肾脏意义的单克隆免疫球蛋白血症诊治专家共识课件
- 家用电器产品检测合同协议
- 消防控制室值班记录表
- SYT 6649-2025《油气管道管体缺陷修复技术规范》
- 2026年高考历史总复习(全国):专题训练01中国古代史部分(选择题必练100题)(原卷版)
评论
0/150
提交评论