第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针第四讲 C++语言基础
5.4 函数
5.5 数组与指针第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针引用 (reference),C++的特点什么是引用,引用是一个别名,是某一个目标对象的替代名,对所有加于引用上的操作实际上就是加于引用的目标对象之上,
例如,int x; //定义了变量 x
int &rx = x; //定义了 x的一个引用问题,1,为什么要用引用?
2,引用与指针的区别?
3,引用的功能是什么?
4,在引用的使用中要注意什么?
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针传值调用和引用调用例 2,希望通过传值调用交换变量值
#include <iostream.h>
void Swap(int,int); //声明函数
void main( )
{ int x=4,y=8; //定义变量
cout << "\n Before Swap x= "<< x
<< ",y= "<< y << endl;
Swap(x,y); //调用函数
cout << "\n After Swap x=" << x
<< ",y= "<< y << endl; }
void Swap(int a,int b) {int t=a; a=b; b=t; }
结果,Before Swap x=4,y=8
After Swap x=4,y=8
为什么?
传值调用,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,通过指针调用交换变量值
#include <iostream.h>
void Swap(int*,int*); //声明函数
void main( )
{ int x=4,y=8; //定义变量
cout << "\n Before Swap x= "<< x
<< ",y= "<< y << endl;
Swap(&x,&y); //通过指针调用函数
cout << "\n After Swap x=" << x
<< ",y= "<< y << endl; }
void Swap(int *a,int *b)
{int t; t=*a; *a=*b; *b=t; }
结果,Before Swap x=4,y=8
After Swap x=8,y=4
为什么?
指针调用,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,通过引用调用交换变量值
#include <iostream.h>
void Swap(int&,int&); //声明函数
void main( )
{ int x=4,y=8; //定义变量
cout << "\n Before Swap x= "<< x
<< ",y= "<< y << endl;
Swap(x,y); //调用函数
cout << "\n After Swap x=" << x
<< ",y= "<< y << endl; }
void Swap(int &a,int &b)
{int t=a; a=b; b=t; }
结果,Before Swap x=4,y=8
After Swap x=8,y=4
为什么?
引用调用,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针引用与指针关系的分析
void Swap(int &a,int &b) //引用调用
{int t=a; a=b; b=t; }
void Swap(int *a,int *b) //指针调用
{int t; t=*a; *a=*b; *b=t; }
void Swap(int a,int b) //传值调用
{int t=a; a=b; b=t; }
区别,1,引用是某一对象的别名,指针是某一变量的地址变量,
2,引用在定义时就必须初始化,即为一已定义的对象的别名,不可以重新赋值,指针可在使用时初始化,且可以重新赋值,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针引用的作用,
1,引用可以象地址一样完成对所代表的对象的操作,
2,对引用的操作不同与对指针的操作,
它可直接作用于变量,所以更方便,更易于理解,
引用的缺点,
引用不能为空,即必须代表某一象,且不能重新赋值,指针灵活性较好,但使用较不方便,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针函数名重载,C++的特点问题,设计一个函数完成两个数相加,
分析,用 C语言,就必须设计两不同名函数,
int Iadd(int a,int b);
float Fadd(float a,float b);
它们分别完成对整型和实型数的加法,
若用 C++,就可以两个同名的函数,
int add(int a,int b);
float add(float a,float b);
它们分别完成对整型和实型数的加法,
作用,由于函数名相同,在函数调用时不必考虑实参数的类型,使编程更便利,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针什么是函数重载,对同一函数进行多次定义例,#include <iostream.h>
int fname(int p) //定义函数
{ cout << "one "; return p*p; }
char fname(char p) //定义函数
{ cout << " two "; return p+4; }
void main( )
{ cout << fname(4) << endl; //
cout << fname(?a?) << endl; //
}
结果,one 16
two d
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针递归函数什么是递归? 一个函数直接或间接地调用自己何时用递归? 问题可被简化,边界有界如 Fibonacci数列,我们有,
fibo(0)=1
fibo(1)=1
fibo(n)=fibo(n-1)+fibo(n-2)
有边界
有边界?
可简化为何用递归? 使难以实现的编程简单化第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,用递归函数求 Fibonacci数列
#include<iostream.h>
unsigned long fibo(unsigned long); //声明函数
void main( )
{ unsigned long result,temp;
cout << " Enter an integer,";
cin >> temp;
result = fibo(temp); //调用函数
cout << "Fibonacci(" << temp << " )= "
<< result << endl; }
unsigned long fibo(unsigned long n) //定义函数
{ if( n = = 0 || n = = 1) return n; //边界条件
else return fibo(n-1) + fibo(n-2); }//递归调用结果,Enter an integer,3
Fibonacci(3) = 3
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针递归执行流程
fibo(3)
return fibo(2)+fibo(1)
return fibo(1)+fibo(0) return 1
return 1 return 1
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针内嵌函数为什么要内嵌函数? 程序中对函数的调用过于频繁,导致程序执行时间加长。
内嵌函数的使用可提高程序执行效率。
内嵌函数的定义? 在函数声明时加 inline
例如,inline void swap(int&,int&);
内嵌函数作用机理? 把内嵌函数的代码直接嵌人函数调用处,而不是转到调用函数的代码处。这样减少了调用转换的开销。
内嵌函数的缺点? 程序执行效率提高了,
但可执行程序规模变大了。实际应用中要权衡效率和规模之间的关系。
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,内嵌函数的定义使用
#include <iostream.h>
inline int max(int a,int b);
{
if( a>b) return a;
else return b; }
void main( )
{ int x,y;
cout << "Enter two integers,";
cin >> x >> y;
cout << " max= " << max(x,y) << endl; }
结果,Enter two integers,10 28
max= 28
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针数组 (array)与指针 (pointer)
什么是数组? 保存相同类型数据的内存单元集合数组的定义? 类型名 数组名 [大小 ];
type ArrayName[size];
例如,int a[5]; 定义了一个整数型数组,
数组名为 a,数组的大小为 5,即有 5个元素:
a[0],a[1],a[2],a[3],a[4].
Float b[2][3]; 定义了一个二维数组,6个元素:
b[0][0],b[0][1],b[0][2],b[1][0],b[1][1],b[1][2].
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针数组使用注意点?
1,数组的第一个元素下标是 0,而不是 1,
如,a[0],b[0][0],等
2,数组的最后一个元素的下标是数组的大小减去 1,如,int a[8]; 的最后一个元素为 a[7].
3,二维数组的定义和使用其下标都是用 []
隔开,而不是用逗号隔开,如,
int b[2][3]; 定义了一个二维数组,而不能定义成,int b[2,3];
b[1][2] 表示数组的第 2行、第 3列元素,
而不能用 b[1,2] 来表示,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针数组的初始化数组可以在定义时初始化,并可以用初始化来确定数组的元素个数。
例如,int b[ ]={2,4,9,15}; 等价于
int b[4]={2,4,9,25};
int c[ ][2]={2,4,5,9,11,19}; 等价于
int c[3][2]={2,4,5,9,11,19};
注意,二维数组初始化时,第二个下标不能省,int c[][]={2,4,5,9,11,19}是错的。在上例中,我们有:
c[0][0]=2,c[0][1]=4,c[1][0]=5,
c[1][1]=9,c[2][0]=11,c[2][1]=19.
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,对数组中的元素按升序排列
#include<iostream.h>
int a[5]={23,42,36,19}; //初始化数组
void sort( ); //声明函数
void main( )
{ sort ( ); //调用函数
for(int i=0; i<5; i++)
cout << "a[" << i << "]= " << a[i] << ",";
}
void sort( ) //定义函数
{ for (int i=0; i<4; i++)
for(int j=i+1;j<5;j++) //把最小的放到 a[i]
if(a[i]>a[j]) { int t=a[i]; a[i]=a[j]; a[j]=t;}
}
结果,a[0]=0,a[1]=19,a[2]=23,a[3]=36,a[4]=42
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针
char 型数组字符型数组可定义为:
char c[ ]={?H?,?i?,,?w?,?o?,?r?,?l?,?d?,?\0?};
数组 c 包含了字符串 Hi world,\0表示结束。
可等价定义为:
char c[ ]="Hi world";
数组的长度为 9个字节,其中,Hi” 占 2个字节,,world”占 5个字节,空格和结束标志,\0”各 1个字节。
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,数组的读入
#include<iostream.h>
void main( )
{ char buffer[80];
cout << "Enter a string," ;
cin >> buffer;
cout << "Here is the buffer,"<< buffer;}
结果,Enter a string,Hi world
Here is the buffer,Hi
程序有两个问题:
1,若用户输入一个多于 79个字符的串,
buffer 不够写,
2,如果输入了空格,将被认为是串的结束,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,数组的读入 (修改后 )
#include<iostream.h>
void main( )
{ char buffer[80];
cout << "Enter a string," ;
cin.get(buffer,79); //调用 cin中的方法 get
cout << "Here is the buffer,"<< buffer;}
结果,Enter a string,Hi world
Here is the buffer,Hi world
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针指 针什么是指针? 保存内存地址的 变量指针的声明? type *Pname
例如,int *pi;
float *pf;
指针的运算?
,*” 是目标访问运算符,用来读取它所指向的内存中的值,
“&” 是取址运算符,用来获取某一变量的地址,int *pi,a=10; pi=&a; cout << *pi;
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,指针的应用
#include <iostream.h>
void main( )
{ int Age=18;
int *PAge=0; //定义空指针 PAge
PAge = &Age; //将 Age的地址赋给 PAge
cout << "My age," << Age << ","
<< *Page << endl;
*PAge=22; //给 PAge指向的内存赋值 22
cout << "My age," << Age << ","
<< *Page << endl;
}
结果,My age,18,18
My age,22,22
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针指针应用注意点
1,指针 使用前 必须初始化,要培养良好的编程风格,对指针进行初始化,不知赋何值可先赋 0.
如,{ int b,a=9; int *pi; pi = &a; b=*pi; }
{ int b,a=9; int *pi=0; }
没有初始化的指针对程序的危害很大
2,注意指针与引用的区别,运算符 &的不同含义,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针例,运算符 &的不同含义
#include<iostream.h>
void main( )
{ int a; //定义整型变量 a
int &ra=a; //定义 a 的引用
a=5;
cout << "a= " << a << ",ra= "
<< ra << endl; //输出值
cout << "&a= " << &a << ",&ra= "
<< &ra << endl; //输出地址
}
结果,a=5,ra=5
&a=0x3500,&ra=0x3500
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针动态内存分配 new和回收 delete
new 类似于 C语言中的 malloc( ),new返回的是内存地址,可赋给一个指针,如,
int *pi; //定义一个指针变量
pi=new int; //分配内存地址给 pi
int *pp,a=9;
pp=&a; //同样给 pp分配了地址注意,如果无内存分配,则返回空指针
NULL,所以应检查有无内存分配,
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针
delete 是释放不需要的内存空间,如,
delete pi;
注意,释放一个已释放的内存可能导致程序崩溃,所以释放后最好置为 0,
如,
float *p=new float; //OK
delete p; //OK
delete p; //危险 !
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针数组与指针的关系数组名是指向该数组第一个元素的指针例,数组与指针的关系
#include <iostream.h>
void main( )
{ int a[4] = {11,22,33,44};
for (int i=0; i<4; i++)
cout << " *(a+ " << i << ")= " << *(a+i)
<< ",a[" << i << "]= " << a[i] ;
}
结果,*(a+0)=11,a[0]=11,*(a+1)=22,a[1]=22,
*(a+2)=33,a[2]=33,*(a+3)=44,a[3]=44
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针课 堂 总 结
1 数组的初始化,特别是字符型数组的初始化和多维数组的初始化。
2 函数重载的实现和作用。
3 进一步复习 C语言中指针的应用,指针使用前要初始化。
4 用 new 和 delete 给指针分配内存地址和释放内存。
5 引用与指针的区别。引用的作用。
6 数组与指针的关系,数组名指向数组第一个元素的地址。
第五章 C++基础
5.1 C++概述
5.2 数据和表达式
5.3 基本语句
5.4 函数
5.5 数组与指针作 业教材:习题 5 的第 5,6,8,11题。