第8章_善于利用指针_2_
职业技术学院教师职位试讲题目

第十八课 二、生词
初级汉语教材
杨寄洲
北京汉语大学出版社
17381职业技术学院教师职位试讲题目 Nhomakorabea序号
专业名称
课程名称
章节
教材名称
作者
出版社
书号
1
计算机科学与技术
C程序设计
第8章善于利用指针
第一节和第二节
C程序设计(第四版)
谭浩强
清华大学出版社
24464
2
旅游管理
导游业务知识
第三章第二节全陪导游服务程序
导游业务知识
新疆维吾尔自治区旅游局编
旅游教育出版社
21948
3
财务管理
基础会计
第二章会计6要素
基础会计
赵丽生
东北财经大学出版社
10246
4
审计
审计学原理
第四章审计风险
审计(第三版)
胡中艾
东北财经大学出版社
04757
5
物流管理
配送管理
第五章第三节商品拣选
配送中心管理与运作
朱华
高等教育出版社
36880
6
电子商务
电子商务概论
第二章第二节B2C电子商务模式
电子商务概论
宋文官
清华大学出版社
90964
7
土木工程
建筑工程测量
第2章第四节
水准测量的方法
建筑工程测量
周建郑
中国建筑工业出版社
96879
8
机械电子工程
电子技术基础
第五章集成运放基本单元电路
电子技术基础
庞程山
北京高等教育出版社
6578
9
体育
第8章-善于利用指针 谭浩强第五版

8.2.3 怎样引用指针变量 • 在引用指针变量时,可能有使三p种指情向况a:
–给指针变量赋值。如:p=&a; *p相当于a
–引用指针变量指向的变量。如有
p=&a; *p=1;
则执行printf(“%d”,*p); 将输出1
–引用指针变量的值。
–如:printf(“%o”,p); 以八进制输出a的地址 10
23
例8.5 输入3个整数a,b,c,要求按由大到小 的顺序将它们输出。用函数实现。 • 解题思路:采用例8.3的方法在函数中改变这3个 变量的值。用swap函数交换两个变量的值,用 exchange函数改变这3个变量的值。
24
#include <stdio.h>
int main()
{ void exchange(int *q1, int *q2, int *q3);
}
交换指针指
向的变量值
26
8.3 数组的指针 8.3.1 数组元素的指针 • 一个变量有地址,一个数组包含若干元素,每个
数组元素都有相应的地址 • 指针变量可以指向数组元素(把某一元素的地址
放到一个指针变量中) • 所谓数组元素的指针就是数组元素的地址
27
• 可以用一个指针变量指向一个数组元素 int a[10]={1,3,5,7,9,11,13,15,17,19}; int *p; p=&a[0];
pointer_1 a
&a 95
pointer_2 b
&b 59
p1 &a
p2 &1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp; }
精品课件-C程序设计(第三版)(荣政)-第8章

第八章 指针
指针类型是对所有类型的指针的总称,指针的类型是指 针所指对象的数据类型。例如,pc是指向字符变量的指针, 简称字符指针。字符指针是基本类型的指针之一,除各种基 本类型之外,允许说明指向数组的指针、指向函数的指针、 指向结构体和共用体的指针以及指向各类指针的指针。在C 语言中只有指针被允许用来存放地址的值,其它类型的变量 只能存放该类型的数据。(很多书中用指针一词来指地址值, 或用指针变量来代表指针,阅读中应注意其具体含义。)
例8.2中指向整型的指针point在定义之后直接使用了,这 两条语句在编译时不会出现语法错误,但在使用时却几乎肯定 会出问题。表面上看,scanf()函数的参数要求给出的是地址, 而point的值就代表的是地址,但是point的值究竟是多少,也 就是说point究竟指向哪里,我们无法得知,在这种情况下就 对point指向的单元进行输入操作,将冲掉point指向的单元的 原有内容,假如这个单元是操作系统的所在处,就破坏了操作 系统,显然是一件危险的事。
为了理解指针的概念,程序员要有关于计算机如何在存储 器中存储信息的基本知识。以下简单地介绍个人计算机中存储 器存储的情况。
第八章 指针
个人计算机中CPU可以直接访问的,用来存储程序和数据 的记忆部件称为内存储器,内存储器由成千上万个顺序存储单 元组成,每个单元由一个惟一的地址标识。给定计算机的存储 器地址范围为从0到所安装的存储器数量的最大值。在计算机 上运行的每一个程序都要使用存储器。例如,操作系统要占用 一些计算机存储空间,每个应用程序也要占用计算机存储空间。 按照面向过程的结构化程序设计方法,程序代码和程序要处理 的数据是分开存储的,所以,一个程序在内存中要占两部分空 间:数据部分和指令代码部分。
第八章 指针
C语言 第8章 善于利用指针

第8章善于利用指针指針是什么⏹如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元⏹内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
⏹在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。
⏹由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。
⏹将地址形象化地称为“指针”⏹务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别指针变量2怎样定义指针变量⏹定义指针变量的一般形式为:类型*指针变量名;如:i n t*p o i n t e r_1,*p o i n t e r_2;•i n t是为指针变量指定的“基类型”•基类型指定指针变量可指向的变量类型•如p o i n t e r_1可以指向整型变量,但不能指向浮点型变量2怎样定义指针变量⏹下面都是合法的定义和初始化:f l o a t*p o i n t e r_3;c h a r*p o i n t e r_4;i n t a,b;i n t*p o i n t e r_1=&a,*p o i n t e r_2=&b;3怎样引用指针变量⏹在引用指针变量时,可能有三种情况:•给指针变量赋值。
如:p=&a;•引用指针变量指向的变量。
如有p=&a;*p=1;则执行p r i n t f(“%d”,*p);将输出1•引用指针变量的值。
如:p r i n t f(“%o”,p);3怎样引用指针变量⏹要熟练掌握两个有关的运算符:(1)&取地址运算符。
&a是变量a的地址(2)*指针运算符(“间接访问”运算符)如果:p指向变量a,则*p就代表a。
k=*p;(把a的值赋给k)*p=1;(把1赋给a)4指针变量作为函数参数通过指针引用数组1数组元素的指针⏹所谓数组元素的指针就是数组元素的地址⏹可以用一个指针变量指向一个数组元素i n t a[10]={1,3,5,7,9,11,13,15,17,19};i n t*p;p=&a[0];⏹在指针指向数组元素时,允许以下运算:•加一个整数(用+或+=),如p+1•减一个整数(用-或-=),如p-1•自加运算,如p++,++p•自减运算,如p--,--p•两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)3通过指针引用数组元素⏹引用一个数组元素,可用下面两种方法:(1)下标法,如a[i]形式(2)指针法,如*(a+i)或*(p+i)其中a是数组名,p是指向数组元素的指针变量,其初值p=a 4用数组名作函数参数⏹用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量⏹C编译都是将形参数组名作为指针变量来处理的通过指针引用字符串1字符串的引用方式⏹字符串是存放在字符数组中的。
2023年上海计算机二三级c程序设计和应用题纲

2023年上海计算机二三级c程序设计和应用题纲【原创版5篇】目录(篇1)1.2023 年上海计算机二级 C 语言考试范围2.2023 年上海计算机三级 C 语言考试范围3.C 语言程序设计和应用题纲分析正文(篇1)2023 年上海计算机二级 C 语言考试范围主要包括 C 语言基本语法、数据类型、运算符、控制结构、函数、指针和文件操作等基本知识。
为帮助考生更好地备考,以下是 2023 年上海计算机二级 C 语言考试范围的详细内容:1.C 语言基本语法:包括 C 语言程序结构、注释、预处理指令等。
2.数据类型:包括基本数据类型(如 int、float、double 等)、复合数据类型(如数组、结构体、联合体等)以及枚举类型等。
3.运算符:包括算术、关系、逻辑运算符以及赋值、取地址等操作符。
4.控制结构:包括条件语句(如 if-else)、循环语句(如 for、while 等)以及 switch-case 等。
5.函数:包括函数定义、调用、参数传递、返回值等,以及递归函数、多态函数等高级功能。
6.指针:包括指针基本概念、指针运算、指针与数组、结构体等的关系,以及动态内存分配等。
7.文件操作:包括文件打开、关闭、读写等基本操作,以及文件指针、缓冲区等高级功能。
2023 年上海计算机三级 C 语言考试范围则在此基础上,增加了数据结构和算法的设计与分析,以及 C 语言编程在实际工程中的应用。
具体包括:1.数据结构:包括线性表、栈与队列、树与二叉树、图等基本数据结构,以及排序、查找、图算法等常用算法。
2.面向对象编程:包括类与对象、封装、继承、多态等面向对象编程的基本概念和应用。
3.应用程序开发:包括 C 语言在操作系统、网络编程、数据库等方面的应用,以及常见的设计模式和架构等。
C 语言程序设计和应用题纲分析主要针对上述知识点,通过典型例题和真题进行讲解,帮助考生深入理解 C 语言编程的基本原理和实际应用。
此外,还需关注历年考试的重点、难点和热点,加强针对性的复习和训练。
211287944_新文科背景下“C语言程序设计”课程教学改革探索

2023.6黑龙江教育·理论与实践2019年4月29日,教育部、中央政法委、科技部等13个部门联合启动“六卓越一拔尖”计划2.0,明确提出要全面推进新工科、新医科、新农科、新文科建设,提高高校服务经济社会发展能力。
其中,新文科建设是指推动哲学社会科学与新科技革命交叉融合,培养新时代的哲学社会科学家,创造光耀时代、光耀世界的中华文化。
新文科意味着文科与另一种学科的深度交叉和融合,尤其是文科与理科、人文与科技的融合。
最早出版“新文科”小册子的斯蒂芬·怀特认为,如果忽视数学和计算机语言,文科教育就不再完整。
文科与新技术的融合不是最终目的,学科交叉融合是为了提高高校服务经济社会发展的能力,是为了更好地解决现实世界中的复杂问题。
新文科建设要求高等教育要主动适应新技术、新业态、新模式、新产业的需求,加快人才培养更多样化、更综合化、更集群化、更智能化、更国际化,推动并引领新一轮产业变革。
为此,文章拟在新文科背景下,开展适用于非工程类(计算机类)的“C 语言程序设计”课程的理论与实践教学方法改革的研究与实践,探索适用于新文科建设的“C 语言程序设计”课程概念体系、课程体系、方法体系等内容,为促进管理学、经济学等专业学生全面发展,提升学生的科技创新能力提供有效路径。
一、“C 语言程序设计”课程教学改革的研究现状(一)混合式教学模式与实践褚美玲阐述了“C 语言程序设计”课程的翻转课堂、传统课堂和互联网教学的时间分配,以及基于大数据背景的混合式“C 语言程序设计”课堂教学与考核[1]。
王玉星阐述了混合式教学模式的构建方法,并对实际的教学效果进行分析[2]。
贾凌杉以“C 语言程序设计”课程改革工作为例,深入分析和探究基于教学平台线上线下混合式教学模式的具体应用价值[3]。
刘海浪等人结合当下高校“C 语言程序设计”课程教学情况,分析了混合式教学模式视角下进行“C 语言程序设计”课程教学改革的背景[4]。
《C语言》章节列表

第1章程序设计和C语言1第2章算法——程序的灵魂16第3章最简单的C程序设计——顺序程序设计第4章选择结构程序设计85第5章循环结构程序设计114第6章利用数组处理批量数据1426.1怎样定义和引用一维数组1426.1.1怎样定义一维数组1436.1.2怎样引用一维数组元素1446.1.3一维数组的初始化1456.1.4一维数组程序举例1466.2怎样定义和引用二维数组1486.2.1怎样定义二维数组1496.2.2怎样引用二维数组的元素1506.2.3二维数组的初始化1516.2.4二维数组程序举例1526.3字符数组1546.3.1怎样定义字符数组1546.3.2字符数组的初始化1556.3.3怎样引用字符数组中的元素1556.3.4字符串和字符串结束标志1566.3.5字符数组的输入输出1596.3.6使用字符串处理函数1616.3.7字符数组应用举例165习题168第7章用函数实现模块化程序设计1707.1为什么要用函数1707.2怎样定义函数1727.2.1为什么要定义函数1727.2.2定义函数的方法1737.3调用函数1747.3.1函数调用的形式1747.3.2函数调用时的数据传递1757.3.3函数调用的过程1777.3.4函数的返回值1787.4对被调用函数的声明和函数原型1797.5函数的嵌套调用1827.6函数的递归调用1847.7数组作为函数参数1927.7.1数组元素作函数实参1937.7.2数组名作函数参数1947.7.3多维数组名作函数参数1977.8局部变量和全局变量1997.8.1局部变量1997.8.2全局变量2007.9变量的存储方式和生存期2047.9.1动态存储方式与静态存储方式2047.9.2局部变量的存储类别2057.9.3全局变量的存储类别2087.9.4存储类别小结2127.10关于变量的声明和定义2147.11内部函数和外部函数2157.11.1内部函数2157.11.2外部函数215习题218第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式 2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较263 8.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量268 8.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组 2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型 2878.9有关指针的小结288习题291第9章用户自己建立数据类型2939.1定义和使用结构体变量2939.1.1自己建立结构体类型2939.1.2定义结构体类型变量 2959.1.3结构体变量的初始化和引用2979.2使用结构体数组3009.2.1定义结构体数组3009.2.2结构体数组的应用举例3019.3结构体指针3039.3.1指向结构体变量的指针3039.3.2指向结构体数组的指针3049.3.3用结构体变量和结构体变量的指针作函数参数306 9.4用指针处理链表3099.4.1什么是链表 3099.4.2建立简单的静态链表3109.4.3建立动态链表3119.4.4输出链表3159.5共用体类型3179.5.1什么是共用体类型3179.5.2引用共用体变量的方式3189.5.3共用体类型数据的特点3199.6使用枚举类型3239.7用typedef声明新类型名326习题330第10章对文件的输入输出33110.1C文件的有关基本知识33110.1.1什么是文件33110.1.2文件名33210.1.3文件的分类33210.1.4文件缓冲区33310.1.5文件类型指针33310.2打开与关闭文件33510.2.1用fopen函数打开数据文件33510.2.2用fclose函数关闭数据文件33710.3顺序读写数据文件33810.3.1怎样向文件读写字符33810.3.2怎样向文件读写一个字符串34110.3.3用格式化的方式读写文件34410.3.4用二进制方式向文件读写一组数据34510.4随机读写数据文件34910.4.1文件位置标记及其定位34910.4.2随机读写 35210.5文件读写的出错检测353习题354第11章常见错误分析355附录370附录A在Visual C++ 6.0环境下运行C程序的方法370附录B常用字符与ASCII代码对照表377附录CC语言中的关键字378附录D运算符和结合性378附录EC语言常用语法提要380附录FC库函数384参考文献390第4章选择结构程序设计854.1选择结构和条件判断854.2用if语句实现选择结构874.2.1用if语句处理选择结构举例874.2.2if语句的一般形式 894.3关系运算符和关系表达式914.3.1关系运算符及其优先次序914.3.2关系表达式924.4逻辑运算符和逻辑表达式924.4.1逻辑运算符及其优先次序934.4.2逻辑表达式944.4.3逻辑型变量964.5条件运算符和条件表达式974.6选择结构的嵌套1004.7用switch语句实现多分支选择结构1024.8选择结构程序综合举例106习题112第5章循环结构程序设计1155.1为什么需要循环控制1155.2用while语句实现循环1165.3用do…while语句实现循环1185.4用for 语句实现循环1215.5循环的嵌套1255.6几种循环的比较1265.7改变循环执行的状态1265.7.1用break语句提前终止循环1275.7.2用continue语句提前结束本次循环1285.7.3break语句和continue语句的区别1295.8循环程序举例132习题141第6章利用数组处理批量数据1436.1怎样定义和引用一维数组1436.1.1怎样定义一维数组1446.1.2怎样引用一维数组元素1456.1.3一维数组的初始化1466.1.4一维数组程序举例1476.2怎样定义和引用二维数组1496.2.1怎样定义二维数组1506.2.2怎样引用二维数组的元素1516.2.3二维数组的初始化1526.2.4二维数组程序举例1536.3字符数组1556.3.1怎样定义字符数组1556.3.2字符数组的初始化1566.3.3怎样引用字符数组中的元素156 6.3.4字符串和字符串结束标志1576.3.5字符数组的输入输出1606.3.6使用字符串处理函数1626.3.7字符数组应用举例166习题169第7章用函数实现模块化程序设计171 7.1为什么要用函数1717.2怎样定义函数1737.2.1为什么要定义函数1737.2.2定义函数的方法1747.3调用函数1757.3.1函数调用的形式1757.3.2函数调用时的数据传递1767.3.3函数调用的过程1787.3.4函数的返回值1797.4对被调用函数的声明和函数原型181 7.5函数的嵌套调用1837.6函数的递归调用1857.7数组作为函数参数1937.7.1数组元素作函数实参1937.7.2数组名作函数参数1957.7.3多维数组名作函数参数1987.8局部变量和全局变量2007.8.1局部变量2007.8.2全局变量2017.9变量的存储方式和生存期2057.9.1动态存储方式与静态存储方式205 7.9.2局部变量的存储类别2067.9.3全局变量的存储类别2097.9.4存储类别小结2137.10关于变量的声明和定义2157.11内部函数和外部函数2167.11.1内部函数2167.11.2外部函数216习题219第8章善于利用指针2218.1指针是什么2218.2指针变量2238.2.1使用指针变量的例子2238.2.2怎样定义指针变量2248.2.3怎样引用指针变量2258.2.4指针变量作为函数参数2278.3通过指针引用数组2328.3.1数组元素的指针2328.3.2在引用数组元素时指针的运算2338.3.3通过指针引用数组元素2348.3.4用数组名作函数参数2398.3.5通过指针引用多维数组2478.4通过指针引用字符串2578.4.1字符串的引用方式 2578.4.2字符指针作函数参数2618.4.3使用字符指针变量和字符数组的比较265 8.5指向函数的指针2688.5.1什么是函数指针2688.5.2用函数指针变量调用函数2688.5.3怎样定义和使用指向函数的指针变量270 8.5.4用指向函数的指针作函数参数2728.6返回指针值的函数2768.7指针数组和多重指针2798.7.1什么是指针数组 2798.7.2指向指针数据的指针2828.7.3指针数组作main函数的形参2848.8动态内存分配与指向它的指针变量2878.8.1什么是内存的动态分配2878.8.2怎样建立内存的动态分配2878.8.3void指针类型 2898.9有关指针的小结290习题293第9章用户自己建立数据类型2959.1定义和使用结构体变量2959.1.1自己建立结构体类型2959.1.2定义结构体类型变量 2979.1.3结构体变量的初始化和引用2999.2使用结构体数组3029.2.1定义结构体数组3029.2.2结构体数组的应用举例3049.3结构体指针3059.3.1指向结构体变量的指针3059.3.2指向结构体数组的指针3069.3.3用结构体变量和结构体变量的指针作函数参数3089.4用指针处理链表3119.4.1什么是链表 3119.4.2建立简单的静态链表3129.4.3建立动态链表3139.4.4输出链表3179.5共用体类型3199.5.1什么是共用体类型3199.5.2引用共用体变量的方式3209.5.3共用体类型数据的特点3219.6使用枚举类型3259.7用typedef声明新类型名328习题332第10章对文件的输入输出33310.1C文件的有关基本知识33310.1.1什么是文件33310.1.2文件名33410.1.3文件的分类33410.1.4文件缓冲区33510.1.5文件类型指针33510.2打开与关闭文件33710.2.1用fopen函数打开数据文件33710.2.2用fclose函数关闭数据文件33910.3顺序读写数据文件34010.3.1怎样向文件读写字符34010.3.2怎样向文件读写一个字符串34310.3.3用格式化的方式读写文件34610.3.4用二进制方式向文件读写一组数据34710.4随机读写数据文件35110.4.1文件位置标记及其定位35110.4.2随机读写 35410.5文件读写的出错检测355习题356第11章常见错误分析374附录390附录A在Visual C++ 6.0环境下运行C程序的方法390 附录CC语言中的关键字398附录D运算符和结合性398附录EC语言常用语法提要400附录FC库函数404参考文献410。
08-指针-程序设计基础-罗兵-清华大学出版社

}
被调函数通过指针访问调用函数的局部变量。
8.2 指针与一维数组
一维数组名就是该数组第一个元素的地址,或数组的首地址。 所以将其赋值给一个指针变量后,二者几乎等价,区别是数组名是 指针常量,指针变量是变量,可以再赋值。
int a[]={1,2,3,4},*p;
// 定义数组、指针变量
p=a;
// p为a数组的首地址、整型指针
*(p+i)=*(p+n-1-i); *(p+n-1-i)=m; } }
// 函数定义 // 交换
8.3 指针与二维数组
int a[3][4]; int (*pa)[4]; char **p2; char *(pd[3]);
// 函数声明,a、n均可省略 // 函数声明,p、n均可省略
上面声明的两个函数,它们的参数形式是完全一样的。
8.2.2 指针做函数参数
例8.7 编写函数,将整型数组的元素值逆序。(一维数组名做参数)
void invert1(int a[],int n); { int m,i;
for(i=0;i<n/2;i++) { m=a[i];
指针是一种数据类型,它长度为4字节,它有两重属性:
内存地址 该地址存储数据的数据类型
8.1.2 指针变量的定义
指针类型有指针变量和指针常量。 指针常量不显性表示,通过变量名加取地址运算符、数组名等表示。 指针变量需要先声明,后使用。需要间接寻址运算符 *
int a,b[5]; int *p; p=&a; p=b;
p1=&m;
// p1为变量m的地址、整型
p2=a;
// p2为数组a的首地址、整型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3) 用指针变量指向数组元素 #include <stdio.h> int main() { int a[10]; int *p,i; printf(“enter 10 integer numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(p=a;p<(a+10);p++) printf(“%d ”,*p); printf("\n"); for(p=a;p<(a+10);p++) return 0; scanf("%d",p); for(p=a;p<(a+10);a++) } printf(“%d ”,*a); 错!
(1) 如果指针变量p已指向数组中的一个元素, 则p+1指向同一数组中的下一个元素,p-1 指向同一数组中的上一个元素。 float a[10],*p=a; 假设a[0]的地址为2000,则 – p的值为2000 – p+1的值为2004 – P-1的值为1996 越界
(2) 如果p的初值 为&a[0],则p+i 和a+i就是数组 元素a[i]的地址, 或者说,它们 指向a数组序号 为i的元素
void inv(int x[ ],int n) { int temp,i,j,m=(n-1)/2; for(i=0;i<=m;i++) { j=n-1-i; temp=x[i];x[i]=x[j];x[j]=temp; } void inv(int x[ ],int n) } { int temp,*i,*j; i=x; j=x+n-1; 优化 for( ; i<j; i++,j--) { temp=*i; *i=*j; *j=temp; } }
例8.8 将数组a中n个整数按相反顺序存放 • 解题思路:将a[0]与a[n-1]对换,……将a[4] 与a[5]对换。
i
j
例8.8 将数组a中n个整数按相反顺序存放 • 解题思路:将a[0]与a[n-1]对换,……将a[4] 与a[5]对换。
i
j
例8.8 将数组a中n个整数按相反顺序存放 • 解题思路:将a[0]与a[n-1]对换,……将a[4] 与a[5]对换。
a[5]
a[6]
a[7]
p+9,a+9
a[8] a[9]
(4) 如果指针p1和p2都 指向同一数组 p2-p1的值是4 不能p1+p2
p1
a[0] a[1] a[2]
a[3] a[4]
a[5]
p2
a[6]
a[7]
a[8] a[9]
8.3.3 通过指针引用数组元素
• 引用一个数组元素,可用下面两种方法: (1) 下标法,如a[i]形式 (2) 指针法,如*(a+i)或*(p+i) 其中a是数组名,p是指向数组元素的指针 变量,其初值p=a
• 3种方法的比较: ① 第(1)和第(2)种方法执行效率相同
– C编译系统是将a[i]转换为*(a+i)处理的,即先 计算元素地址。 – 因此用第(1)和第(2)种方法找数组元素费时较 多。
② 第(3)种方法比第(1)、第(2)种方法快
– 用指针变量直接指向元素,不必每次都重新计 算地址,像p++这样的自加操作是比较快的 – 这种有规律地改变地址值(p++)能大大提高执行 效率
8.3.2 在引用数组元素时指针的运算
• 在指针指向数组元素时,允许以下运算:
– – – – – 加一个整数(用+或+=),如p+1 减一个整数(用-或-=),如p-1 自加运算,如p++,++p 自减运算,如p--,--p 两个指针相减,如p1-p2 (只有p1和p2都指向同 一数组中的元素时才有意义)
第八章
主要内容
8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.5 指向函数的指针 8.6 返回指针值的函数
8.பைடு நூலகம் 指针数组和多重指针
8.8 动态内存分配与指向它的指针变量
8.9 有关指针的小结
本章要点
• 掌握指针概念、指针变量的定义方法。 • 掌握如何通过指针引用数组、字符串 • 掌握多重指针
(2) 通过数组名计算数组元素地址,找出元素的值 #include <stdio.h> int main() { int a[10]; int i; printf(“enter 10 integer numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf(“%d ”,*(a+i)); printf("\n"); scanf("%d",a+i); return 0; }
8.3通过指针引用数组 8.3.1 数组元素的指针 8.3.2 在引用数组元素时指针的运算 8.3.3 通过指针引用数组元素 8.3.4 用数组名作函数参数 8.3.5 通过指针引用多维数组
8.3.1 数组元素的指针
• 一个变量有地址,一个数组包含若干元素, 每个数组元素都有相应的地址 • 指针变量可以指向数组元素(把某一元素 的地址放到一个指针变量中) • 所谓数组元素的指针就是数组元素的地址
8.3.4 用数组名作函数参数
• 用数组名作函数参数时,因为实参数组名 代表该数组首元素的地址,形参应该是一 个指针变量 • C编译都是将形参数组名作为指针变量来 处理的
int main() { void fun(int arr[],int n]; int array[10]; ┇ fun (array,10); fun(int *arr,int n) return 0; } void fun(int arr[ ],int n) {┇ }
i
j
例8.8 将数组a中n个整数按相反顺序存放 • 解题思路:将a[0]与a[n-1]对换,……将a[4] 与a[5]对换。
i
j
例8.8 将数组a中n个整数按相反顺序存放 • 解题思路:将a[0]与a[n-1]对换,……将a[4] 与a[5]对换。
i
j
#include <stdio.h> int main() { void inv(int x[ ],int n); int i, a[10]={3,7,9,11,0,6,7,5,4,2}; for(i=0;i<10;i++) printf(“%d ”,a[i]); printf("\n"); inv(a,10); for(i=0;i<10;i++) printf(“%d ”,a[i]); printf("\n"); return 0; }
array数组
• 实参数组名是指针常量,但形参数组名是 按指针变量处理 • 在函数调用进行虚实结合后,它的值就是 实参数组首元素的地址 • 在函数执行期间,形参数组可以再被赋值
void fun (arr[ ],int n) { printf(″%d\n″, *arr); arr=arr+3; printf(″%d\n″, *arr); }
例8.6 有一个整型数组a,有10个元素,要 求输出数组中的全部元素。 • 解题思路:引用数组中各元素的值有3种方 法:(1)下标法;(2)通过数组名计算数组元 素地址,找出元素的值;(3) 用指针变量指 向数组元素 • 分别写出程序,以资比较分析。
(1) 下标法。 #include <stdio.h> int main() { int a[10]; int i; printf(“enter 10 integer numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf(“%d ”,a[i]); printf("%\n"); return 0; }
8.3.5 通过指针引用多维数组
• 指针变量可以指向一维数组中的元素,也 可以指向多维数组中的元素。但在概念上 和使用方法上,多维数组的指针比一维数 组的指针要复杂一些。
1. 多维数组元素的地址 int a[3][4]={{1,3,5,7}, {9,11,13,15},{17,19,21,23}};
void sort(int *x,int n) void sort(int x[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) if (*(x+j)>*(x+k)) k=j; { k=i; for(j=i+1;j<n;j++) if(x[j]>x[k]) k=j; if(k!=i) { t=x[i];x[i]=x[k];x[k]=t; } } {t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;} }
例8.10 用指针方法对10个整数按由大到小 顺序排序。 • 解题思路:
– 在主函数中定义数组a存放10个整数,定义int * 型指针变量p指向a[0] – 定义函数sort使数组a中的元素按由大到小的顺 序排列 – 在主函数中调用sort函数,用指针p作实参 – 用选择法进行排序
#include <stdio.h> int main() { void sort(int x[ ],int n); int i,*p,a[10]; p=a; for(i=0;i<10;i++) scanf(“%d”,p++); p=a; sort(p,10); for(p=a,i=0;i<10;i++) { printf(“%d ”,*p); p++; } printf("\n"); return 0; }