C语言程序设计第八章 指针的使用
《C程序设计》课程标准

《C程序设计》课程标准一、课程说明:1.本课程的性质:C程序设计是近年来在国内外得到迅速推广应用的一种现代程序设计语言,它以丰富灵活的控制和数据结构,简洁而高效的语句表达、良好的移植性,已被广泛的应用于系统软件和应用软件的开发中。
2.本课程教学目的及任务:教学目的:通过学习C程序设计课程,使学生掌握 C语言的基本内容及程序设计的算法思想与编程技巧,了解进行科学计算的一般思路,培养学生应用计算机解决和处理实际问题的思维方法与基本能力,为以后学习数据结构、操作系统等后继课程创造必备的条件,并为今后从事软件开发打下良好基础。
教学任务:通过理论学习和编程训练,使学生了解C语言特点,理解C语言的基本概念,掌握C语言的语法规则和结构化程序设计的特点、方法及开发工具的使用,激发学生底层编程方向的兴趣,培养学生的编程能力。
3.本课程教学与其他课程的关系:先修课程:《计算机文化基础》后继课程:《数据结构》、《操作系统》、《数据库原理及应用》4.教学时数分配:总学时72,理论52,实验20。
教学时数分配表5.建议教材与参考书谭浩强·《C程序设计》(第三版)·清华大学出版社谭浩强·《C语言程序设计》(第二版)·清华大学出版社·2008主要参考书:谭浩强·《C程序设计》(第三版)·清华大学出版社谭浩强·《C语言程序设计》(第二版)·清华大学出版社谭浩强·《C程序设计题解与上机指导》(第三版)清华大学出版社谭浩强·《C程序设计教程实习指导与模拟试题》6.考核模式:考试二、课程内容:第一章 C语言概述【教学要求】:熟悉TURBO C2.0/VisualC++6.0集成环境的使用了解用计算机解决实际问题的基本步骤掌握C程序的构成和C程序的运行过程。
【本章重点】:C程序的构成和C程序的运行过程【本章难点】:用计算机解决实际问题的基本步骤【教学内容】:第一节:C语言出现的历史背景第二节:C语言的特点第三节:简单的C程序介绍第四节:C程序的上机步骤和方法【参考书目】:谭浩强·《C语言程序设计》(第二版)·清华大学出版社第二章数据类型、运算符与表达式【教学要求】:掌握C语言中的各种数据类型及变量的定义方法。
《C语言程序设计教程(第二版)》 第09章-指针(1)

访问p_int所 指向的变量
getch();
}
程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p
2019/2/22
11
1、指针变量的定义
指针变量的定义标识符
数据类型 *指针变量[,*指针变量2……];
例如, [案例9.1]中的语句:
int num_int=12, *p_int ;
特别说明:定义而未初始化的指针变量(例如 p_int)是悬空的。
使用悬空指针变量,很容易破坏系统,导致系统 瘫痪。
2019/2/22
12
2、取地址运算 : &变量名 例 如 , [ 案 例 9.1] 中 的 &num_int 、 &num_f 、 &num_ch 的结果,分别为对应变量的地址 (num_int 、 num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的 地址。 例如, [案例9.1]中的指针变量p_int、p_f、p_ch, 只能接收int型、float型、char型变量的地址,否则出 错。
使p_int指向变量num_int
2019/2/22
10
printf(“num_int=%d, *p_int=%d\n”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2f\n”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%c\n”, num_ch, *p_ch);
9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数
C语言程序设计下mooc答案

—06.30北京理工大学M O O C C语言程序设计(下)网上作业答案第一周编程作业1、求最大公约数和最小公倍数(15分)题目内容:编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。
输入格式:两个正整数输出格式:最大公约数和最小公倍数输入样例:12,40[回车]输出样例:最大公约数:4[回车]最小公倍数:120[回车]时间限制:500ms内存限制:32000kbCode:#include <stdio.h>int fun1(int m,int n){int r;r=m%n;return r==0?n:fun1(n,r);}int fun2(int m,int n){int t;t=m*n/fun1(m,n);return t;}int main(){ int t,m,n;scanf("%d,%d",&m,&n);if(m<n){t=m;m=n;n=t;}printf("最大公约数:%d\n",fun1(m,n));printf("最小公倍数:%d\n",fun2(m,n));return 0;}2、排序并插入(15分)题目内容:编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:9个整数和1个整数输出格式:10个整数输入样例:2,3,1,5,6,76,89,31,90[回车]7[回车]输出样例:1,2,3,5,6,7,31,76,89,90[回车]时间限制:500ms内存限制:32000kb Code:#include <stdio.h>int main(){int t,j,i,n[10];for(i=0; i<9; i++){scanf("%d", &n[i]);if(i<8) scanf(",");}scanf("%d",&n[9]) ;for(i=0;i<9;i++){for(j=0;j<= 8-i;j++){if(n[j] > n[j+1]){t = n[j];n[j] = n[j+1];n[j+1] = t;}}}for(i=0;i<10;i++){printf("%d",n[i]);if(i<9) printf(",");}return 0;}第二周编程作业1、最大公约数(15分)题目内容:输入两个整数m,n,用递归算法实现计算两个数的最大公约数。
C语言程序设计(第2版)

该教材分为12个章节,主要包括程序设计概述,数据及其运算,简单程序设计,分支结构程序设计,循环结 构程序设计,组数,函数,指针,结构体,文件,共用体、枚举和位运算,C++程序设计基础。每一章的开始设 置有“本章导读”和“主要知识点”栏目。“本章导读”既对该章教学内容进行引入,又对该章教学内容进行简 介;“主要知识点”则对该章知识逐项进行罗列说明。每一章节后还设有本章小结与习题等栏目。此外,还包括C 语言的保留字、C语言的运算符两个附录的内容。
成书过程
成书过程
作者秉承“建设精品教材,培养优秀人才”的教育理念,听取和采纳了任课教师的意见,吸收、借鉴其他教 材的长处,融入教学实践经验和教学研究成果,在结构和内容两个方面对第1版进行了全面的调整优化,编写完成 了该教材 。
《C语言程序设计(第2版)》由张磊任主编,冯伟昌、黄忠义、张元国任副主编,魏建国、王桂东、魏军、 高永存、薛莹、徐英娟、徐思杰、潘振昌、王金才、王涛、张文、彭玉忠、马明祥、滕秀荣、李竹健、王凤丽、 曲立杰、刘福香参加了该教材编写工作,全书由张磊统稿和定稿。该教材的编写和出版也得到了相关人员的支 持。
2009年8月22日,该教材由高等教育出版社出版 。
内容简介
C语言程序设计教学课件1- C语言语法基础

(add函数)
1.2 数据的基本类型及其表现形式
1.2 数据的基本类型及其表现形式
1.2.1 常量和变量
1、常量 在程序执行过程中,其值不发生改变的量称为常量。
根据书写方式,常量可分为直接常量和符号常量。 (1)直接常量:如 4、23;1.23; 'a'、'b';''CHINA''等 (2)符号常量:用#define指令,指定一个标识符代表一个常量。
2)若同时定义多个同类型的变量,定义格式:
类型标识符 变量名1,变量名2,变量名3,…;
例如:int i, j, k;
//同时定义三个基本整型变量i、j、k
定义变量后,系统将根据变量的类型给变量分配对应大小的内存空间,用于存储
该变量。 例如: short int i; //定义短整型变量i
i = 10;
1.1 C语言程序的特点
产生于20世纪70年代的C语言是国际上广泛流行的计算机高级编程语言 ,C语言具有的优点包括:①灵活的语法和丰富的运算符;②模块化和结构 化的编程手段,程序可读性好;③可以直接对硬件进行操作,能够实现汇编 语言的大部分功能;④生成的目标代码质量高,程序执行效率高,C语言一 般只比汇编程序生成的目标代码效率低10%~20%;⑤用C语言编写的程序 可移植性好(与汇编语言相比),基本上不做修改就能用于各种型号的计算 机和各种操作系统。
②原样输出的字符,在显示中起提示作用。
(2)输出列表:是需要输出的一些数据,可以是常量、变量或表达式。 多个数据之间要用逗号隔开。
使用printf函数时,要求格式控制字符串中必须含有与输出项一一对应的格 式符,并且类型要匹配。printf函数也可以没有输出项。
c语言程序设计第五版教学设计

C语言程序设计第五版教学设计一、教学目标通过学习本章课程,学生应该能够掌握以下知识:1.了解C语言的数据类型和控制结构2.掌握如何定义函数和使用函数3.了解指针和数组的使用方法4.熟悉C语言的文件操作二、课程安排第一节课:C语言初步介绍1.C语言简介及开发环境搭建2.C语言程序的基本结构和语法规则第二节课:数据类型和变量1.C语言的数据类型2.常量和变量的定义和使用3.进制转换和位运算第三节课:控制结构和循环语句1.条件语句、循环语句和跳转语句2.选择结构和循环结构3.“switch…case”语句的使用方法第四节课:函数的定义和应用1.函数的基本概念2.函数的语法和规则3.函数的调用和参数传递第五节课:指针和数组1.指针和地址的概念2.操作指针变量3.数组的定义和使用方法4.递归函数和指针数组第六节课:文件操作1.文件的打开和关闭2.文件的读写操作3.二进制文件和文本文件的区别三、教学方法1.讲授法:通过PPT和白板讲解课程内容2.互动讨论:在学生学习的过程中引导学生发表自己的看法和思路3.实践操作:在课堂上编写一些简单的程序来帮助学生更好地理解和掌握知识点四、评估方法1.平时成绩:平时考勤、作业、课堂发言和实践操作等占20%的成绩2.期中考试:占30%的成绩3.期末考试:占50%的成绩五、教学资源1.课程教材:《C语言程序设计》第五版2.PPT课件:根据课程内容编写的PPT课件3.开发工具:Visual Studio、Dev-C++、Codeblocks等六、教学建议1.学生学习本章内容之前,需要具备一定的编程基础,包括基本的编程语法和逻辑思维能力2.在课程安排中加入一些有趣的案例或编程实例,以激发学生的兴趣3.引导学生在课程学习之外进行更多的实践操作和编程实践,以巩固学习效果七、总结本章课程是C语言程序设计入门的基础,是学生进一步深入学习C语言的重要基础。
通过本章课程的学习,学生可以掌握C语言的基本语法、数据类型和控制结构,以及函数、数组和指针的使用。
《C语言程序设计》实验报告实验六
《C语言程序设计》实验报告实验六使用指针的程序设计学号姓名一、实验目的1、掌握指针的概念,会定义和使用指针变量;2、能正确使用数组的指针和指向数组的指针变量;3、熟悉指针作为函数参数的定义和调用方法;4、能正确使用字符串的指针和指向字符串的指针变量。
二、实验内容1.分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。
#include <stdio.h>void main(){int *p1,*p2,*p;int a,b;printf("Input a b please");scanf("%d%d",&a,&b);p1=&a;p2=&b;if(a>b){ p=p1;p1=p2;p2=p;}printf("*p1=%d, *p2=%d\n",*p1,*p2);printf("a=%d, b=%d\n",a,b);}『运行结果:』输入1,2得:*p1=1,*p2=2a=1,b=2输入2,1得:*p1=1,*p2=2a=2,b=1输入56,123得:*p1=56,*p2=123a=56,b=1232.下列程序的功能是分别求出数组中所有奇数之和以及所有偶数之和。
形参n给了数组中数据的个数,利用指针odd返回奇数之和,利用指针even 返回偶数之和。
请在下面空白处将实现这一功能的函数完善,并且调试运行出结果。
#include <stdio.h>#define N 10void fun(int *a,int n,int *odd,int *even){int m;*odd=0; *even=0;for(m=0;m<n;m++)if(*(a+m)%2==0)*even+=*(a+m);else*odd+=*(a+m);}void main(){int a[N]={1,10,2,3,19,6},i,n=6,odd,even;printf("The original data is:\n");for(i=0;i<n;i++)printf("%5d",*(a+i));printf("\n\n");fun(a,n,&odd,&even);printf("The sum of odd numbers:%d\n",odd);printf("The sum of even number:%d\n",even);}『运行结果:』3.编程实现从键盘输入一个字符ch和一个字符串str,利用字符指针实现删除字符串str中和字符ch相等所有字符,然后输出字符串str。
指针与数组
3.通过一个行指针变量引用二维数组的元素
定义一个由m个元素组成的一维数组的指 针变量的一般形式:
类型标识符 (*指针变量名)[m];
注意:*p两侧的圆括号不可缺少。 例如:假若有语句 int a[2][3], (*p)[3]; p=a;
则:⑴ p是一个指向由3个整型元素组成的一 维数 组的指针变量。
方法ain() { int a[10]={54,65,8,2,3,56,8,21,57,98},i;
for(printf("\n"),i=0;i<10;i++) printf("%4d",*(a+i)); }
方法三:用指针变量指向数组元素
main() { int a[10]={54,65,8,2,3,56,8,21,57,98},*p,i;
⑵ p指向a数组,p+1指向数组a的下一行首地 址,a和p的基类型相同,则a数组中任意元 素a[i][j]还可以如下表示: *(p[i]+j) 、*(*(p+i)+j) 、(*(p+i))[j] 、p[i][j]
例:使用行指针变量访问数组元素。
main() {
float fa[5][10], (*pf)[10]=fa; int i,j; for(i=0; i<5; i++)
C语言程序设计
指针与数组
1.1 一维数组的指针
数组的指针 :是数组的起始地址。
数组元素的指针 :是数组元素的地址。 当指针变量指向数组或数组元素时,它就是指 向数组的指针变量。
C规定: ⑴数组名代表数组的首地址(起始地址),
也就是第一个元素的地址。
⑵当指针变量p指向数组时,p+1指向数组 的下一个元素。假设一个整型元素占两 个字节,p+1是使p的地址加2个字节。
《C语言程序设计》 课后习题答案 高等教育出版社
《C语言程序设计》课后习题答案高等教育出版社《C语言程序设计》课后习题答案高等教育出版社第一章:C语言概述1. C语言的特点C语言是一种以处理底层任务和系统编程为目标的高级编程语言。
其特点包括语法简洁、执行效率高、可移植性强等。
第二章:C语言基本数据类型1. C语言中的基本数据类型C语言中的基本数据类型包括整型、字符型、浮点型等。
整型可以进一步细分为有符号整型和无符号整型。
第三章:C语言运算符1. C语言中的运算符C语言中常见的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符等。
这些运算符用于执行各种数学和逻辑操作。
第四章:C语言控制语句1. C语言中的条件语句C语言提供了if语句和switch语句来实现条件判断。
if语句用于执行基于布尔表达式的条件分支,而switch语句用于根据不同的值执行不同的代码块。
第五章:C语言函数1. C语言中的函数定义和调用函数是C语言中的基本模块,用于封装可重用的代码。
函数定义包括函数返回类型、函数名、参数列表和函数体等部分。
第六章:C语言数组1. C语言中的数组定义和使用数组是一组相同类型的数据元素的集合。
C语言中可以使用数组来存储和操作大量数据。
第七章:C语言指针1. C语言中的指针概念指针是一种变量,它存储了内存地址。
通过指针,可以直接访问和修改对应内存地址中的数据。
第八章:C语言字符串1. C语言中的字符串操作字符串是由一系列字符组成的数据类型。
C语言通过字符数组来表示和操作字符串。
第九章:C语言结构体1. C语言中的结构体定义和使用结构体是一种自定义的复合数据类型,它可以包含多个不同类型的成员变量。
第十章:C语言文件操作1. C语言中的文件读写操作文件操作是一种重要的数据输入和输出方式。
C语言提供了一系列函数来实现文件的读写操作。
总结:通过解答以上习题,我们可以更好地掌握C语言的各个方面,提升我们的编程能力和解决问题的能力。
希望本文对读者有所帮助。
苏小红c语言程序设计课后答案
苏小红c语言程序设计课后答案苏小红的《C语言程序设计》是一本广泛使用的教材,它以清晰的结构和丰富的示例,帮助学生掌握C语言的基础知识和编程技巧。
课后答案对于学生来说是一个重要的学习资源,可以帮助他们检查自己的学习成果,加深对知识点的理解。
以下是一些可能的课后答案示例,用于帮助学生复习和理解C语言程序设计的相关概念。
第一章:C语言概述1. C语言的发展历史:C语言由Dennis Ritchie在20世纪70年代初期开发,最初用于UNIX操作系统的编写。
2. C语言的特点:C语言是一种结构化语言,具有高度的灵活性和强大的功能,能够进行底层系统编程。
第二章:C语言基础1. 数据类型:C语言提供了多种数据类型,包括整型(int)、浮点型(float和double)、字符型(char)等。
2. 变量声明:变量在使用前必须声明,声明时需要指定数据类型和变量名。
第三章:运算符和表达式1. 算术运算符:包括加(+)、减(-)、乘(*)、除(/)等。
2. 赋值运算符:如`=`,`+=`,`-=`等,用于给变量赋值或进行运算后赋值。
第四章:控制结构1. 条件语句:如`if`,`else if`,`else`,用于根据不同的条件执行不同的代码块。
2. 循环语句:包括`for`循环、`while`循环和`do-while`循环,用于重复执行代码块。
第五章:数组1. 一维数组:存储相同类型的元素,可以通过下标访问数组元素。
2. 多维数组:如二维数组,可以看作是数组的数组。
第六章:函数1. 函数定义:使用`return`类型和函数名来定义函数。
2. 函数调用:通过函数名和必要的参数来调用函数。
第七章:指针1. 指针变量:存储另一个变量的内存地址。
2. 指针运算:包括地址运算和指针的增减。
第八章:结构体和联合体1. 结构体:可以包含不同类型的数据成员。
2. 联合体:所有成员共享相同的内存位置。
第九章:预处理指令1. 宏定义:使用`#define`来定义常量或代码片段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
对内存中变量的访问,用scanf("%d%d ",&x,&y) 表示将数据输入变量的地址所指示的内存单元。
那么,访问变量,首先应找到其在内存的地址,或者说,一个地址唯一指向一个内存变量,我们称这个地址为变量的指针。
如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。
指针是什么呢?可以看作是内存中的一个地址。
这个地址是内存中另一个变量的位置。
在图8-2中,变量x的地址是2000H,就可以称为x的“指针”。
知识链接—变量的直接访问和间接访问图8-3 直接访问和间接访问8.2 指针变量的定义与引用8.2.1 指针变量的定义和赋值1.定义指针变量的定义格式如下: 类型说明 * 变量名其中“*”表示这是个指针变量,变量名表示定义的指针变量的名称,类型说明表示指针变量所指向的变量的数据类型。
例如: 表示定义了一个名称为p 的指针变量(注意变量名不是*p ),它指向的变量的数据类型是int 。
2.赋值指针变量和普通变量一样,使用之前必须赋值,未经赋值的指针变量不可使用。
给指针变量只能给它赋值地址,而不能赋予任何其他数据。
C 语言中提供了地址运算符“&”来表示变量的地址,其一般形式为:&变量名比如&x 表示变量x 的地址。
指针变量的赋值可以按下面的方式:试一试(一):将上面的3行代码改成:p = x;能通过编译吗?运行结果是什么?【说明】编译时会出现警告:'int *' differs in levels of indirection from 'int ',意思是int *(p变量的数据类型)和int(x变量的数据类型)不匹配。
运行结果会报错,如图8-4所示:图8-4 指针变量p初始化错误1从上面的错误可以看出,整数5被编译器当作了地址(0x00000005)。
而当第4行输出p 指向的变量的值,报出不能读取的错误,因为0x00000005不是本程序分配的地址。
所以从安全性方面的考虑,会不允许这个读取操作。
试一试(二):将第3行代码改成:*p = x;能通过编译吗?运行结果是什么?【说明】编译时会出现警告:local variable 'p' used without having been initialized。
意思是变量p 在使用前没有初始化。
显然,*p=x这条语句只给*p赋了值,而并没有给变量p赋值。
运行后会报错,如图8-5所示。
图8-5 指针变量p初始化错误2这是因为指针变量p没有赋初值,所以它指向的是一个系统给的不知名的地址(在这次执行时系统分配的是0xcccccccc),虽然p的空间本程序有控制权,但是地址0xcccccccc本程序并没有控制权。
出于安全性考虑,系统禁止向这个地址写入值(*p = x),所以报错。
试一试(三):下面的代码编译会有问题吗?【说明】第1行定义了指针变量p,它指向的变量的数据类型为int。
而在第3行给它赋的值是一个double型的地址。
所以会报警告:incompatible types - from 'double *' to 'int *'。
8.2.2 指针变量的引用1.指针变量的引用引用指针变量,是提供对变量的一种间接访问形式。
对指针变量的引用形式为:*指针变量其含义是指针变量所指向的值。
【课堂案例8-1】接收键盘输入的一个小数,用指针的方法将这个数输出。
【案例目标】会使用指针变量实现输出。
【案例知识要点】指针变量的定义、指针变量的赋值、指针的引用。
【案例程序代码】pointRef.c图8-6 pointRef.exe执行结果【程序说明】●第5行定义了指针变量p1,它指向的变量的数据类型是浮点型。
●第8行将浮点型变量x的地址赋给指针变量p1。
●第9行用指针的方法输出。
2.“&”和“*”运算符前面用到了“&”和“*”运算符。
现在总结一下:“&”运算符是一个返回操作数地址的单目运算符,称为取地址运算符。
例如:p1 = &x;就是将变量x的内存地址赋给p1。
“*”运算符称为指针运算符,作用是返回指定内存中的变量值。
例如上面程序中的p1中装有变量x的地址,则:y = *p1;就是将变量x的值赋给y。
若x的值是1.0,则y的值也是1.0。
下面通过案例8-2来深入了解指针的使用。
【课堂案例8-2】创建程序sort.c,使用指针实现:接收从键盘输入两个整数,按由大到小的顺序输出。
【案例目标】指针的综合运用。
【案例知识要点】&运算符、*运算符、指针变量的定义和使用。
【案例程序代码】swap.c【程序说明】●执行完第9行代码后,内存中指针与变量的关系如图8-7(假定输入的是10,15)。
●第11行的表达式如果为真,则表示第1个数小于第2个数,会执行12~16行的代码。
●第15行执行完毕后,内存中指针与变量的关系如图8-8。
注意:在程序的运行过程中,指针变量所指向的变量始终没变。
即*p1始终代表x,*p2始终代表y。
改变的只是变量x 和y所在内存里的内容。
p1x *p1p2y *p2p1x *p1p2y *p2试一试(四):图8-7 p1和p2初始化后内存图图8-8 p1和p2指向变量的值交换后的内存图结果会相同吗?【说明】程序运行结果是完全相同的。
但程序在运行过程中,实际存放在内存中的数据没有移动,而是将指向该变量的指针交换了指向。
如图8- 9右所示:p1x *p1p2y *p2p1x *p1图8- 9 sort1.exe执行后内存图当指针交换指向后,p1和p2由原来指向的变量x和y改变为指向变量y和x,这样一来,*p1就表示变量y,而*p2就表示变量x。
在上述程序中,无论在何时,只要指针与所指向的变量满足p=&x;我们就可以对变量x以指针的形式来表示。
此时p等效于&x,*p等效于变量x。
8.3 数组与指针8.3.1 指针的自加自减运算假定定义了指针变量p,对它做“加1”运算,不是简单地将p的值加上1,而是将p 的值加上1倍的它所指向的变量占用的内存字节数。
指针加i(即p+=i)是将p的值加上i 倍的它所指向变量占用的内存字节数。
对于int型变量,它占用内存的字节数为4,因此,p++后p的值增加4,如图8-10所示。
pp+1图8- 10 p++后的内存图8.3.2 使用指针访问一维数组假设我们定义一个一维数组,该数组在内存会有系统分配的一个存储空间,其数组的名字就是数组在内存的首地址。
若再定义一个指针变量,并将数组的首址传给指针变量,则该指针就指向了这个一维数组。
我们说数组名是数组的首地址,也就是数组的指针。
而定义的指针变量就是指向该数组的指针变量。
对一维数组的引用,既可以用传统的数组元素的下标这里a是数组名,也代表数组的首地址,所以可以将它赋值给指针变量p。
知识链接—认识数组名由于a [ 0 ]的地址就是数组的首地址,所以下面的语句和上面的等价。
C语言中指针对数组的表示方法有下面几种:●p+n 与a + n表示数组元素a [n]的地址,即&a[n]。
对整个a数组来说,共有5个元素,n的取值为0~4,则数组元素的地址就可以表示为p + 0~p + 4或a + 0~a + 4,与&a[0]~& a [ 4 ]保持一致。
●知道了数组元素的地址表示方法,* ( p + n )和* ( a + n)就表示为数组的各元素即等效于a [ n ]。
●指向数组的指针变量也可用数组的下标形式表示为p [ n ],其效果相当于* ( p + n )。
下面用【课堂案例8-3】来具体说明。
【课堂案例8-3】定义一个长度为5的数组,以数组的不同引用形式输出数组各元素的值。
【案例目标】会使用指针访问数组元素。
【案例知识要点】指针变量表示的地址法访问数组元素、数组名表示的地址法访问数组元素、指针表示的下标法访问数组元素、指针法访问数组元素。
【案例程序代码】pointArray.c图8- 11 pointArray.exe执行后内存图【程序说明】●第8行:给指针变量p赋值了数组a的首地址。
●第9行:最开始p指向数组的首地址,即第一个元素的地址,所以*p输出数组的第1个元素。
●第10行:采用指针变量表示的地址法输出数组第2个元素。
因为p+1表示数组元素a [1]的地址。
所以*(p+1)表示a[1]的值。
● 第11行:采用数组名表示的地址法输出数组第2个元素。
因为a 表示的是数组的第1个元素的地址, a+1表示的是第2个元素的地址。