C++高级语言程序设计第六章
C++程序设计(谭浩强完整版)第六章PPT学习教案

程序模拟这个方法,开始时把a[0][0] 的值赋给变量max,max就是开始时的擂 主,然后让下一个元素与它比较,将二 者中值大者保存在max中,然后再让下 一个元素与新的max比,直到最后一个 元素比完为止。max最后的值就是数组 所有元素中的最大值。
第20页/共93页
max=a[0][0]; //使max开始时取a[0][0]的值 for (i=0;i<=2;i++) //从第0行到第2行 for (j=0;j<=3;j++) //从第0列到第3列 if (a[i][j]>max)//如果某元素大于max { max=a[i][j]; //max将取该元素的值 row=i; //记下该元素的行号i colum=j; //记下该元素的列号j }
static int a[2][3];
第17页/共93页
void main(void)
{ int a[3][3], i, j;
i=0 a[0][0]=0 a[0][1]=1 a[0][2]=2
for (i=0; i<3; i++) i=1 a[1][0]=0 a[1][1]=1 a[1][2]=2
数组必须先定义,具体引用时(赋值、运算、输出)其元
素等同于变量。
a
void main(void )
i=0, a[0]=0
{ int i, a[10]; 定义 i=1, a[1]=1
for ( i=0; i<10; i++) i=2, a[2]=2
赋值 a[i]=i; i=9, a[9]=9
for ( i=9; i>=0 ; i--)
其元素分别为:a[0][0], a[0][1], a[0][2], a[0][3],
C++高级语言程序设计第六章

-21-
6.2.4指针的关系运算和逻辑运算
相同类型的指针可以进行各种关系运算。比较 两个指针相等还是不相等。 进行指针“大于”、“小于”的比较,只是要 判定指针在内存中的相对位置。 指针和一般的整数比较是没有意义的,也是不 允许的。惟一可以和指针比较的整数是0。通 过指针和0的比较来判定指针本身是不是空指 针。
int d1[3];
123
int *pi=(int*)memcpy(d1,s1,12);
cout<<*pi<<" "<<*(pi+1)<<" "<<*(pi+2)<<endl;
}
2020/12/9
-26-
6.2.6 指针类型转换
实际应用的指针变量都是有类型的,指针类型就是 指针所指的地址空间所存放的数据的类型。 除了void指针,不同类型的指针是不可以自动类 型转换的,也就不能进行赋值运算。在例6-1中的 语句pvf1=pva1(整型指针赋值给float指针)就是 有语法错误的语句。 指针类型不仅不能自动转换,也不能进行强制类型 转换。
//间接访问结果是
ppva=&pva;
cout<<"*ppva="<<*ppva<<endl; //间接访问结果是 地址
cout<<"pva="<<pva<<endl; 2020/12/9的内容
//就是指针pva
-17-
6.2.2 间接引用运算
2020/12/9
-18-
6.2.3 指针的算术运算
float vf1='A',*pvf1,*pvf2;
大学C语言程序设计 第六章

2.函数表达式: 2.函数表达式: 函数表达式
功能:将函数作为表达式的一部分。 功能:将函数作为表达式的一部分。 如: c=2*max(a,b); 要点:要求函数带回一个确定的值,以参加表达式的运算。 要点:要求函数带回一个确定的值,以参加表达式的运算。
3.一个函数作为另一个函数的参数: 3.一个函数作为另一个函数的参数: 一个函数作为另一个函数的参数
若不需要函数带回任何值,可使用: 若不需要函数带回任何值,可使用:
void printstar(){ …} } void print_message(){…} print_message(){ }
例exp6_5:函数返回值的类型与其定义的 exp6_5:函数返回值的类型与其定义的 类型不符的情况。 类型不符的情况。
一函数的定义重点二函数的调用重点1函数的一般调用2函数的嵌套调用3函数的递归调用三数组作为函数的参数难点四局部变量与全局变量难点五变量的存储类别难点六内部函数与外部函数1概述2函数定义的方法重点3函数的参数难点4函数的返回值难点1c程序的基本结构回顾2什么是函数
第六章
[教学要求] 教学要求]
函
数
1.理解函数的功能。 理解函数的功能。 2.掌握函数定义的一般形式(重点)。 掌握函数定义的一般形式(重点)。 掌握函数的形参与实参的对应关系、 3.掌握函数的形参与实参的对应关系、参数传递方法及函数返回值 的概念(难点) 的概念(难点) 。 掌握函数调用的基本方法(重点) 4.掌握函数调用的基本方法(重点) 。 掌握函数嵌套调用的一般过程(重点) 5.掌握函数嵌套调用的一般过程(重点) 。 了解函数递归调用的几种形式。 6.了解函数递归调用的几种形式。 掌握数组名作为函数的参数的一些特点(难点) 7.掌握数组名作为函数的参数的一些特点(难点) 。 8.掌握局部变量与全局变量的概念及它们的使用特点(难点) 。 掌握局部变量与全局变量的概念及它们的使用特点(难点) 掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 9.掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 10.了解内部函数与外部函数的含义。 10.了解内部函数与外部函数的含义。
C高级语言程序设计第6章PPT课件

int k1=100;
ch=&ch1;
//指针ch指向变量ch1
必须注意:不同类型的指针是不可以互相赋值的。在 指针赋值时,不存在类型自动转换的机制。
2020/11/3
北京邮电大学信息与通信工程学院
-13-
例6.1 观察以下指针赋值运算的结果。如果将注释去
掉,结果将如何?
#include <iostream> using namespace std; void main() {int va1=100,*pva1;
C++高级语言程序设计
第6章 指针和引用
2020/11/3
北京邮电大学信息与通信工程学院
1
指针(Pointer)是C++和C的一 种数据类型。很多其他高级语言 也有类似的数据类型。引用 (Reference)则是C++所特有的 一种数据类型。指针和引用在概 念上和使用上都有相似之处,但 是也有重要的差别。
2020/11/3
北京邮电大学信息与通信工程学院
-2-
第六章 指针和引用
6.1 指针的概念 6.2 指针的运算 6.3 指针访问动态内存 6.4 指向结构体的指针 6.5 引用概念 6.6 指针和引用作为函数的参数 6.7 指针和引用作为函数的返回值 6.8 指针和字符串 6.9 通过指针访问数组
其中的变量名应该是已经声明或定义的同类型变量 名。例如:
char ch1=’Y’, ch2=’A’; char *pch1=&ch1, *pch2=&ch2;
2020/11/3
北京邮电大学信息与通信工程学院
-9-
6.1.2 指针变量的声明和初始化
第06章 指针

17
高 级 语 言 程 序 设 计 与 应 用 教 程
6.3 指针和地址运算
1、指针变量的加、减运算(移动运算) 将指针变量的原值加上n个
它指向的变量所占用的内存 指针可以参与加法和减法运算,但其加、减的含义绝对 单元字节数。 不同于一般数值的加减运算。如果指针p是这样定义的: ptype *p;,并且p当前的值是ADDR,那么:
第 六 章
指 针
学习指针是学习C语言中最重要的一环, 能否正确理解 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 C语言中的指针就不懂什么是C语言。
2
高 级 语 言 程 序 设 计 与 应 用 教 程
本章学习重点
指针的概念 指针变量的定义、初始化和引用 指针的运算 指针与一维数组 指针与二维数组 指针与字符串 指针作为函数的参数
第 六 章
指 针
3
高 级 语 言 程 序 设 计 与 应 用 教 程
6.1 指针与地址
1、内存地址──内存中存储单元的编号 教学楼
存储地址
内存
存储 单元
0 …... 2000 2001
601 501
602 502
50
2002 注意:内存单元的地址与内存单元中的数据是 401 402 两个完全不同的概念。 2003 存储单元有
指针变量p 2000 指针变量q 2000
第 六 章
…...
指 针
12
高 级 语 言 程 序 设 计 与 应 用 教 程
指针变量赋值的几种错误方法: 例 int *p = &a; int a;
变量a的定义在后,对a的引 用超出了a的作用域
第 六 章
注意:一个指针变量只能指向同类型的变量如果给指针赋 例 int a; 值时,=号右边的指针类型与左边的指针类型不同,则需要 int *pi = &a; pc不能指向非字符型变量 进行类型强制转换。 char *pc = &a; int a; 赋值语句中,被赋值的指针 例 int int *pi; a; 变量p的前面不能再加“*” int *p; 说明符 char *pc; *p = &a; pi = &a; //pi指向a 不允许直接把一个数(或任 pc = (char *)pi; //pc也指向了a,即pi和pc的值都是a的地址 例 int *p; 何其他非地址类型的数据) p = 2000; 赋值给指针变量
《C语言程序设计》课件第6章

6.2函数
❖ 例6.1 main() { hello(); } void hello() { printf ("Hello,world \n"); }
❖ 运行结果:
6.2函数
❖ 2.有参函数的一般形式
类型说明符 函数名(形参表) 型式参数类型说明 { 类型说明 语句 } 有参函数比无参函数多了两个内容,分别是形参表和形参的类型说 明。可以是各种类型的变量,但必须与实参类型相匹配。 各参数之 间用逗号间隔。函数调用时,主调函数中实际参数的值应该是确定 的值。
6.1函数分类
C语言中可从不同的角度对函数分类。
❖ 1. 从函数定义的角度,函数分为库函数和用户定义函数。
(1)库函数 由C系统提供,用户无须定义, 不必在程序中作类型说 明,需在程序前包含有该函数原型的头文件即可在程序中直接 调 用。如printf()、scanf()、getchar()、putchar ()等函数 均属库函数。
6.2函数
6.2.4函数的值
❖ 函数的值是指函数被调用之后,执行函数体中的程序段所取得的并 返回给主调函数的值。对函数的值(或称函数返回值)有以下一些说 明: 1.函数的值只能通过return语句返回主调函数。 return 语句的一般形式为: return 表达式; 或者为: return (表达式); 该语句的功能是表达式的值返回给主调函数。在函数中允许有多 个return语句,但每次调用只能有一个return 语句被执行,因 此只能返回一个函数值。
❖ 函数声明的一般形式为: 类型标识符 函数名(参数类型 参数,参数类型 参数…) 也可以写成 类型标识符 函数名(参数类型,参数类型…) 括号内给出的是形参的类型和形参名,或者只给出参数类型。便于 编译系统进行检查,防止可能出现的错误
C语言程序设计教程第六章课后习题参考答案

C语⾔程序设计教程第六章课后习题参考答案P158 1求三个实数最⼤值#includefloat max(float,float,float);int main(){float a,b,c,m;printf("请输⼊三个实数:");scanf("%f %f %f",&a,&b,&c);printf("最⼤数为%f\n",max(a,b,c));return 0;}float max(float a,float b,float c){float t;if(a>b&&a>c)t=a;else if(b>a&&b>c)t=b;elset=c;return t;}P158 2求最⼤公约数最⼩公倍数#includeint fun1(int a,int b);int fun2(int a,int b);int main(){int a,b;printf("请输⼊两个整数:");scanf("%d %d",&a,&b);printf("最⼤公约数为:%d\n",fun1(a,b));int t,r;if(a{t=a;a=b;b=t;}while((r=(a%b))!=0) {a=b;b=r;}return b;}int fun2(int a,int b) {int n;n=(a*b)/fun1(a,b); return n;}P158 3求完全数#includevoid wan(int n); void main(){int n;for(n=1;n<1000;n++) wan(n);printf("\n");}void wan(int n){if(n%i==0)s=s+i;}if(n==s)printf("%d\t",n); }P158 4⽆暇素数#include#includeint nixvshu(int n);int isPrime(int n);int main(){int n,t;printf("⽆暇素数:\n");for(n=100;n<=999;n++) {t=nixvshu(n);if(isPrime(n)&&isPrime(t)) printf("%d\t",n);}printf("\n");return 0;}int nixvshu(int n){int x=0;while(n){x=x*10+n%10;n=n/10;}return x;int i;for(i=2;i<=sqrt(n);i++)if(n%i==0) return 0;return n;}P158 7递归函数#includeint Y(int n){if(n==0)return 0;if(n==1)return 1;if(n==2)return 2;elsereturn (Y(n-1)+Y(n-2)+Y(n-3)); } int main(){int n,k=0;for(n=0;n<=19;n++){printf("%d\t",Y(n));k++;if(k%5==0)printf("\n");}return 0;}P124 6分解质因数#include#includevoid fenjie(int );int main(){int n;printf("请输⼊⼀个正整数:"); scanf("%d",&n);if(isPrime(n)){printf("%d=1*%d\n",n,n);}else{fenjie(n);printf("\n");}return 0;}int isPrime(int n){int i;for(i=2;i<=sqrt(n);i++){if(n%i==0) return 0;}return 1;}int zhi(int n){int m;for(m=2;m<=n;m++){if(isPrime(m)&&(n%m==0)) break;void fenjie(int n){int m;printf("%d=%d",n,zhi(n));while(n>zhi(n)){m=zhi(n);n=n/m;printf("*%d",zhi(n));}}P47 1输出闰年#includeint f(int year);int main(){int year,k=0;for(year=1900;year<=2000;year++){if(f(year)){printf("%d\t",year);k++;if(k%5==0)printf("\n");}}return 0;}int f(int year){if((year%4==0&&year%100!=0)||(year%400==0)) return year;P47 2输出回⽂数#includeint fun(int n);int main(){int n,k=0;for(n=10;n<=2000;n++) {if(n == fun(n)){printf("%d\t",n);k++;if(k%5==0)printf("\n");}}return 0;}int fun(int n){int i=0;while(n>0){i=i*10+n%10;n=n/10;}return i;}P47 3进制转换#includevoid trans(int n,int base); int main()printf("请输⼊要转换的⼗进制数:"); scanf("%d",&n);printf("请输⼊转换的进制:"); scanf("%d",&base);trans(n,base);printf("\n");return 0;}(⽅法⼀)void trans(int n,int base){if(n){trans(n/base,base);if(n%base>=10)switch(n%base){case 10:printf("A");break;case 11:printf("B");break;case 12:printf("C");break;case 13:printf("D");break;case 14:printf("E");break;case 15:printf("F");break;}elseprintf("%d",n%base);}}(⽅法⼆)void trans(int n,int base){int r;char c;trans(n/base,base); r=n%base;if(r>=10)c='A'+r-10;elsec='0'+r;printf("%c",c);}}。
高级语言程序设计第6章参考答案

1.6.3习题解答编程题1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主调函数调用这两个函数,并输出结果。
两个整数由键盘输入。
分析:求两个数a和b的最大公约数:设这个数为x,则x一定小于等于a和b中的较小者min(a,b)。
在区间[1, min(a,b)]中能找到的最后一个同时被a和b整除的那个数,就是a和b的最大公约数x。
求两个数a和b的最小公倍数:设这个数为x,则x一定大于等于a和b中的较大者max(a,b),而小于等于a*b。
在区间[max(a,b), a*b ]中找到的第一个能同时整除a和b的那个数,就是a和b的最小公倍数x。
参考程序代码:#include "stdio.h"f1(int a, int b)/*求最大公约数*/{int x,i;for(i=1;i<=(a<=b?a:b);i++){if(a%i==0&&b%i==0){x=i;}}printf("\n最大公约数为: %d\n",x);}f2(int a, int b)/*求最小公倍数*/{int i,x;for(i=((a>b)?a:b);i<=a*b;i++){if(i%a==0&&i%b==0){x=i;break;}}printf("\n最小公倍数为: %d\n",x);}void main(){int a,b;printf("\n请输入两个数:\n");printf("a=");scanf("%d", &a);printf("b=");scanf("%d", &b);f1(a, b);f2(a, b);}运行结果:请输入两个数:a=4b=16最大公约数为:4最小公倍数为:162.编写一个函数,其功能是对于给定的一个时间数(秒为单位),以“时:分:秒”的格式输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指针类型转换
2012-7-7 北京邮电大学信息与通信工程学院 -16-
例6.3 定义指向指针的指针变量。观察对这种指针变量 间接访问的结果。
#include <iostream> using namespace std; void main() { int va=100,*pva,**ppva; //ppva是指向指针的指针 int k1=100; pva=&va; cout<<"*pva="<<*pva<<endl; //间接访问结果是整型数 ppva=&pva; cout<<"*ppva="<<*ppva<<endl; //间接访问结果是地址 cout<<"pva="<<pva<<endl; //就是指针pva的内容 }
#include <iostream> 运行结果: using namespace std; *ch=a ch1=B void main() *ch=d {char ch1='a',*ch; int k1=100; ch=&ch1; //指针ch指向变量ch1 cout<<"*ch="<<*ch<<endl; //间接访问 *ch='B'; cout<<"ch1="<<ch1<<endl; //直接访问 ch1=k1; cout<<"*ch="<<*ch<<endl; //间接访问 }
2和引用
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9
2012-7-7
指针的概念 指针的运算 指针访问动态内存 指向结构体的指针 引用概念 指针和引用作为函数的参数 指针和引用作为函数的返回值 指针和字符串 通过指针访问数组
2012-7-7 北京邮电大学信息与通信工程学院 -6-
6.1.2 指针变量的声明和初始化
指针变量声明的格式是: <类型名> *变量名1, *变量名2; 例如: int *va1, *va2; char *ch1, *ch2; 指针变量在声明后,变量的值(地址)是随机 的。这样的指针变量是不能安全的使用的。因 为其中的随机地址完全可能不是有效的数据地 址。
北京邮电大学信息与通信工程学院 -3-
6.1 指针的概念
2012-7-7
北京邮电大学信息与通信工程学院
4
6.1.1 指针和指针变量
指针是变量的地址。或者说是在内存中,存放 某种类型变量的地址。 例如,定义了整型变量a,a的地址就是一个指 针。 也可以不定义任何变量,只是指定内存某个地 址开始(如0x00430100)的4个字节存放整型 变量,这样的地址也是指针。 存放指针的变量就是指针变量。
#include <iostream> value of pva1 is 0x00000000 0x0012FF7C 0x0012FF7C using namespace std; 0x0012FF74 0x0012FF74 void main() 注释去掉会出现编译错误 {int va1=100,*pva1; float vf1='A',*pvf1,*pvf2; int *pva2=NULL; cout<<"value of pva1 is "<<pva2<<endl; pva1=&va1; pvf1=pvf2=&vf1; cout<<pva1<<" "<<&va1<<endl; cout<<pvf1<<" "<<pvf2<<endl; //pvf1=pva1; } 北京邮电大学信息与通信工程学院 -142012-7-7
指针变量都是有类型的.指针变量的类型就是 它所指定的地址单元中存放的数据的类型。
2012-7-7 北京邮电大学信息与通信工程学院 -8-
6.1.2 指针变量的声明和初始化
指针变量的初始化有两种方法:在声明时的初 始化和声明后的初始化。 声明指针变量时就进行初始化的格式是: <类型名> *指针变量名=&变量名;
2012-7-7
北京邮电大学信息与通信工程学院
-21-
6.2.4指针的关系运算和逻辑运算
相同类型的指针可以进行各种关系运算。比较 两个指针相等还是不相等。 进行指针‚大于‛、‚小于‛的比较,只是要 判定指针在内存中的相对位置。 指针和一般的整数比较是没有意义的,也是不 允许的。惟一可以和指针比较的整数是0。通 过指针和0的比较来判定指针本身是不是空指 针。
指针p和整数n相加(相 减)的含义是指向当前 指向位置p的前方或后 方第n个数据的地址。
2012-7-7
北京邮电大学信息与通信工程学院
-19-
例6.3 通过指针的间接访问,输出下标为偶数的数组元 素的值。
#include <iostream> using namespace std; 每次循环,指针加2 void main() { int k1[10]={11,24,37,44,58,66,79,86,93,108},*k; k=&k1[0]; for(int i=0;i<10;i=i+2) cout<<"k1["<<i<<"]="<<*(k+i)<< " "; cout<<endl; }
北京邮电大学信息与通信工程学院 -5-
2012-7-7
6.1.1 指针和指针变量
当声明了一个指针变量后,确定了三件事:
变量本身在内存中所分配的地址和字节数,指针变 量总是占有4个字节; 系统允许的地址范围,以及地址单元内可以存放的 内容; 指针变量可以进行的运算。
访问指针变量时,只能看到地址。只有通过这 个地址,才能访问地址单元中的内容。这样的 访问称为对于内存单元的间接访问。
6.2.2 间接引用运算
间接引用运算符‚*‛是一种一元算符,它和 指针变量连用,对指针所指向的内存地址单元 进行间接访问。使用的格式是: *指针变量 如果指针变量iptr指向整型变量va,*iptr就 是变量va的内容
2012-7-7
北京邮电大学信息与通信工程学院
-15-
例6.2 对变量的直接访问和间接访问:写出以下程序 运行结果。
2012-7-7 北京邮电大学信息与通信工程学院 -7-
6.1.2 指针变量的声明和初始化
在声明指针变量时的‚*‛,有两个含义:
声明变量va1、va2、ch1、ch2都是指针变量; 说明变量va1和va2的类型是(int *)型,即指向 整型变量的指针。va1和va2所指定的地址单元中, 只能存放整型数据。类似地,ch1和ch2的类型是 (char *)型,它们所指定的地址单元中,只能存 放字符。
char *pch="Hello C++"; cout<<pch<<endl; cout<<(void*)pch<<endl;
2012-7-7 北京邮电大学信息与通信工程学院 -25-
例6.4 使用memcpy通用复制函数复制数组。
#include <iostream> 复制字符数据,10个 using namespace std; 字节 #include <string.h> void main() { char src[10]="012345678"; 复制整型数据,12个 char dest[10]; 字节 char* pc=(char*)memcpy(dest,src,10); cout <<pc <<endl; int s1[3]={1,2,3}; 运行结果: 012345678 int d1[3]; 1 2 3 int *pi=(int*)memcpy(d1,s1,12); cout<<*pi<<" "<<*(pi+1)<<" "<<*(pi+2)<<endl; }
2012-7-7 北京邮电大学信息与通信工程学院 -17-
运行结果: *pva=100 *ppva=0x0012FF7C pva=0x0012FF7C
6.2.2 间接引用运算
2012-7-7
北京邮电大学信息与通信工程学院
-18-
6.2.3 指针的算术运算
指针可以进行的算术运算只有加法和减法。 指针可以和一个整数n做加法或者减法运算。
2012-7-7 北京邮电大学信息与通信工程学院 -26-
6.2.6 指针类型转换
实际应用的指针变量都是有类型的,指针类型就是 指针所指的地址空间所存放的数据的类型。 除了void指针,不同类型的指针是不可以自动类型 转换的,也就不能进行赋值运算。在例6-1中的语 句pvf1=pva1(整型指针赋值给float指针)就是有 语法错误的语句。 指针类型不仅不能自动转换,也不能进行强制类型 转换。
int i1=’Y’, i2=’A’; int *pi1, *pi2; pi1=&i1; pi2=&i2;
没有初始化指针变量是不可以使用的。编译带 有这样的指针变量的程序,编译系统会给出警 告,而运行时会出现错误。