高级语言 C++程序设计
(第二版)
刘景、周玉龙编第六章 指针、引用与动态内存分配
6.1 选择排序算法选择排序算法思想,每次从无序的序列中选出最大者,
交换到序列的左端,这样,无序的序列越来越短,经过 n-1步,达到排序的目的。
[有序序列 ]( 无序序列 )
选择排序算法:
//program6-1.cpp
#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>
void main(void)
{
选出最大交换到左端第六章 指针、引用与动态内存分配
void main(void)
{
int i,seed,n=20;
cout<<endl<<“seed=”;
cin>>seed;
cout<<endl;
srand(seed);//初始化随机种子
float list[20],*pf;
for(i=0;i<n;i++) //生成 n个随机数并输出
{
list[i]=rand();//产生 0~32767之间的随机数。
cout<<setw(8)<<list[i];//每个随机数的输出宽度为 8
if((i+1)%8==0)
cout<<endl;
}
第六章 指针、引用与动态内存分配
cout<<endl;
pf=&list[0];
ssort(pf,n); //对 n个数排序
i=0;
while(i<n){
cout<<setw(8)<<list[i];//输出排序的 n个数
i++;
if(i%8==0)
cout<<endl;
}
cout<<endl;
}
void swap1(float *a,float *b) { //交换两个变量的值
float temp;
temp=*a;*a=*b;*b=temp;}
第六章 指针、引用与动态内存分配
void ssort(float *a,int m)
{
int i,j,index;
float elem;
for(i=0;i<m-1;i++){
elem=*(a+i);//输出排序的 n个数
index=i;
for(j=i+1;j<m;j++)
if(*(a+j)>elem){
elem=*(a+j);
index=j;
}
swap1(a+i,a+index);
}
}
第六章 指针、引用与动态内存分配
6.2 指针类型
6.2.1 指针变量说明格式,<类型名 > *<指针变量名 >=<初值 >
示例,
int *ptr;
float a=3.0,b,c[4];
float *pa=&a;
float *p[2]={&a,&b};
float *pn=NULL;
float *pc=c;
float *pf=new float;
point *pp; //point是一个类,pp是类对象指针。
6.2.2 指针变量的操作
1、取地址运算 &和取内容运算 *
第六章 指针、引用与动态内存分配
2、数组指针的算术运算
int a[10],*pa;
pa=a;
则,a[i],*(a+i),*(pa+i)是等价的。
注:
指针的移动与类型有关。
a是常量,而 pa是变量。当 pa+=3时,*pa为 a[3]。
指针与二维数组的关系见,P.173.
3、指针的关系运算三种情况,(P.173.)
相等
与 NULL比较
还可进行大于、小于、大于等于及小于等于等运算。
第六章 指针、引用与动态内存分配
6.2.3 指针与数组
1、指向数组元素的指针( P.174.)
2、指向数组的指针 (P.174~175.)
定义格式,<类型名 >(*<指针变量名 >)[<数组元素个数 >]
例,int (*pa)[4];//表示指针变量 pa是一个指向一维整型数组的指
//针,该数组包含 4个整型元素。
float A[2][4];
float (*pa)[4];
pa=A; //则 pa指向 A[0]
3、指针数组定义格式,<类型名 > *<数组名 >[<元素个数 >]
例,(P.175.)
int a,b,c,d,A[2][4];
int *p1[4]={&a,&b,&c,&d};
int *p2[2]={A[0],A[1]}
第六章 指针、引用与动态内存分配
6.2.4 字符串指针
1、说明与初始化( P.176.)
例,char *pc2=“World”;
char as[10]=“Chinese”;
char *pc3=as;
2、字符串的整体输入输出 (P.176~177.)
格式,cin >> <字符指针变量 >
cout<< <字符串 >
3、字符串指针数组 (P.177.)
4,字符串的标准函数 (P.177.)
例,(P.178.)
6.2.5 指针与函数
1、指针作函数参数( P.179~180.)
2,函数返回指针( P.180.)
第六章 指针、引用与动态内存分配
3、函数指针( P.180~181.)
注,函数有类型,即返回值类型;函数也有地址,称为入口地址。
函数指针,函数的地址。
定义格式,<类型 >(*<指针变量名 >)(<参数类型表列 >)
例,int f1(float);
int f2(char);
int f3(float);
int f4(float);
int (*pf)(float)=&f1;//合法
int (*pf1)(char)&f1;//不合法
pf=&f4; //合法
pf=&f2; //不合法
6.3 指针与动态内存分配
6.3.1 动态分配运算符( new,delete)
第六章 指针、引用与动态内存分配例,int *pi;
char *pc;
float *pf;
pi=new int;
pc=new char[4];
pf=new float(4.7);
delete pi;
delete pf;
delete []pc;
6.3.2 用指针进行内存动态分配( P.182~183.)
说明,有了 new和 delete,就可以在程序运行过程中进行内存分配,
而不需要预先分配。(分配后,一定要注意回收。)
第六章 指针、引用与动态内存分配
6.4 引用类型
1,引用变量的说明格式,<类型名 >&<变量名 >=<对象变量名 >
例,int size=5,color;
int &refs=size;
int &refc=color;
2,引用和指针的比较( P.184~185.)
指针表示的是一个对象变量的地址,而引用则表示一个对象变量的别名。
指针是可变的,而引用变量只能在定义时一次确定,不可改变。
注,
引用类型变量不能被引用
引用类型不能组成数组
引用类型不能定义指针第六章 指针、引用与动态内存分配
3,引用型参数( P.185.)
优点,
可以把函数外的变量以别名的形式引入到函数体内参加运算。
不必在调用时创建与实参变量或对象对应的值的参数变量,节省空间。
比指针参数更安全。(由于指针可以改变内容,任意赋值。)
4,引用型的函数返回值说明,引用型返回类型的函数调用就是一种左值表达式,可以作为值,也可以被赋值。
例 (P.186.):
int a=3,b=5,c;
int &maxr(int &m,int &n)
{ if(m>n)return m;
return n;
}
第六章 指针、引用与动态内存分配
6.5 程序实例
6.5.1 按人名字典序排列电话簿( P.187~189.)
6.5.2 构建人员档案链表( P.189~191.)