您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《C++程序设计实践例题》 > 第2章 第二章

第3节 第三部分

例6.1 通过指针变量访问整型变量。

#include <iostream>

usingnamespacestd;

intmain( )

{inta,b;                                  //定义整型变量a,b

int*pointer_1,*pointer_2;                //定义指针变量*pointer_1,*pointer_2

a=100;b=10;                               //对a,b赋值

pointer_1=&a;                             //把变量a的地址赋给pointer_1

pointer_2=&b;                             //把变量a的地址赋给pointer_2

cout<<a<<" "<<b<<endl;                    //输出a和b的值

cout<<*pointer_1<<" "<<*pointer_2<<endl;  //输出*pointer_1和*pointer_2的值

return0;

}

 

例6.10 定义一个字符数组并初始化,然后输出其中的字符串。

#include <iostream>

usingnamespacestd;

intmain( )

{ charstr[]="I love CHINA!";

cout<<str<<endl;

return0;

}

 

例6.11 定义一个字符串变量并初始化,然后输出其中的字符串。

#include <string>

#include <iostream>

usingnamespacestd;

intmain( )

{ string str="I love CHINA!";

cout<<str<<endl;

return0;

}

 

例6.12 定义一个字符指针变量并初始化,然后输出它指向的字符串。

#include <iostream>

usingnamespacestd;

intmain( )

{ char*str="I love CHINA!";

cout<<str<<endl;

return0;

}

 

例6.13 将字符串str1复制为字符串str2。

#include <iostream>

usingnamespacestd;

intmain( )

{ charstr1[]="I love CHINA!",str2[20],*p1,*p2;

p1=str1;p2=str2;

for(;*p1!='\\0';p1++,p2++)

 *p2=*p1;

*p2='\\0';

p1=str1;p2=str2;

cout<<"str1 is: "<<p1<<endl;

cout<<"str2 is: "<<p2<<endl;

return0;

}

 

例6.14 求a和b中的大者。

先按一般方法写程序:

#include <iostream>

usingnamespacestd;

intmain( )

{intmax(intx,inty);              //函数声明

inta,b,m;

cin>>a>>b;

m=max(a,b);                        //调用函数max,求出最大值,赋给m

cout<<"max="<<m<<endl;

return0;

}

 

intmax(intx,inty)

{intz;

if(x>y) z=x;

elsez=y;

return(z);

}

 

现在将上面程序的主函数修改如下:

#include <iostream>

usingnamespacestd;

intmain( )

{intmax(intx,inty);              //函数声明

int(*p)(int,int);                 //定义指向函数的指针变量p

inta,b,m;

p=max;                             //使p指向函数max

cin>>a>>b;

m=p(a,b);

cout<<"max="<<m<<endl;

return0;

}

 

例6.15 若干字符串按字母顺序(由小到大)输出。

#include <iostream>

usingnamespacestd;

intmain( )

{ voidsort(char*name[],intn);                //声明函数

voidprint(char*name[],intn);               //声明函数

char*name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};  //定义指针数组

intn=5;

sort(name,n);

print(name,n);

return0;

}

voidsort(char*name[],intn)

{ char*temp;

inti,j,k;

for(i=0;i<n-1;i++)

{k=i;

for(j=i+1;j<n;j++)

if(strcmp(name[k],name[j])>0) k=j;

if(k!=i)

{ temp=name[i];name[i]=name[k];name[k]=temp;}

}

}

 

voidprint(char*name[],intn)

{ inti;

for(i=0;i<n;i++)

cout<<name[i]<<endl;

}

 

例6.16 指向字符型数据的指针变量。

#include <iostream>

usingnamespacestd;

intmain( )

{ char**p;                //定义指向字符指针数据的指针变量p

char*name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};

p=name+2;                //见图6.23中p的指向

cout<<*p<<endl;          //输出name[2]指向的字符串

cout<<**p<<endl;         //输出name[2]指向的字符串中的第一个字符

}

 

例6.17 引用和变量的关系。

#include <iostream>

#include <iomanip>

usingnamespacestd;

intmain( )

{ inta=10;

int&b=a;                  //声明b是a的引用

a=a*a;                     //a的值变化了,b的值也应一起变化

cout<<a<<setw(6)<<b<<endl;

b=b/5;                     //b的值变化了,a的值也应一起变化

cout<<b<<setw(6)<<a<<endl;

return0;

}

 

例6.18 要求将变量i和j的值互换。下面的程序无法实现此要求。

#include <iostream>

usingnamespacestd;

intmain( )

{ voidswap(int,int);                 //函数声明

inti=3,j=5;

swap(i,j);                          //调用函数swap

cout<<i<<" "<<j<<endl;              //i和j的值未互换

return0;

}

 

voidswap(inta,intb)      //企图通过形参a和b的值互换,实现实参i和j的值互换

{ inttemp;

temp=a;                             //以下3行用来实现a和b的值互换

a=b;

b=temp;

}

 

例6.19 使用指针变量作形参,实现两个变量的值互换。

#include <iostream>

usingnamespacestd;

intmain( )

{ voidswap(int*,int*);

inti=3,j=5;

swap(&i,&j);                            //实参是变量的地址

cout<<i<<" "<<j<<endl;                  //i和j的值已互换

return0;

}

 

voidswap(int*p1,int*p2)              //形参是指针变量

{ inttemp;

temp=*p1;                              //以下3行用来实现i和j的值互换

*p1=*p2;

*p2=temp;

}

 

例6.2 输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)。

#include <iostream>

usingnamespacestd;

intmain( )

{

int*p1,*p2,*p,a,b;

cin>>a>>b;                             //输入两个整数

p1=&a;                                 //使p1指向a

p2=&b;                                 //使p2指向b

if(a<b)                                //如果a<b就使p1与p2的值交换

{p=p1;p1=p2;p2=p;}                    //将p1的指向与p2的指向交换

cout<<"a="<<a<<" b="<<b<<endl;

cout<<"max="<<*p1<<" min="<<*p2<<endl;

return0;

}

 

例6.20 利用“引用形参”实现两个变量的值互换。

#include <iostream>

usingnamespacestd;

intmain( )

{ voidswap(int&,int&);

inti=3,j=5;

swap(i,j);

cout<<"i="<<i<<"  "<<"j="<<j<<endl;

return0;

}

 

voidswap(int&a,int&b)             //形参是引用类型

{ inttemp;

temp=a;

a=b;

b=temp;

}

 

例6.3 题目同例6.2,即对输入的两个整数按大小顺序输出。

这里用函数处理,而且用指针类型的数据作函数参数。

程序如下:

#include  <iostream>

usingnamespacestd;

intmain( )

{ voidswap(int*p1,int*p2);     //函数声明

int*pointer_1,*pointer_2,a,b;  //定义指针变量pointer_1,pointer_2,整型变量a,b

cin>>a>>b;

pointer_1=&a;                       //使pointer_1指向a

pointer_2=&b;                       //使pointer_2指向b

if(a<b) swap(pointer_1,pointer_2);  //如果a<b,使*pointer_1和*pointer_2互换

cout<<"max="<<a<<" min="<<b<<endl;//a已是大数,b是小数

return0;

}

 

voidswap(int*p1,int*p2)            //函数的作用是将*p1的值与*p2的值交换

{ inttemp;

temp=*p1;         

*p1=*p2;

*p2=temp;           

}

 

例6.4 输入a,b,c 3个整数,按由大到小的顺序输出。

用上面介绍的方法,用3个指针变量指向3个整型变量,然后用swap函数来实现互换3个整型变量的值。

程序如下:

#include <iostream>

usingnamespacestd;

intmain( )

{ voidexchange(int*,int*,int*);    //对exchange函数的声明

inta,b,c,*p1,*p2,*p3;

cin>>a>>b>>c;                        //输入3个整数

p1=&a;p2=&b;p3=&c;                   //指向3个整型变量

exchange(p1,p2,p3);                  //交换p1,p2,p3指向的3个整型变量的值

cout<<a<<" "<<b<<" "<<c<<endl;       //按由大到小的顺序输出3个整数

}

 

voidexchange(int*q1,int*q2,int*q3)

{voidswap(int*,int*);              //对swap函数的声明

if(*q1<*q2) swap(q1,q2);             //调用swap,将q1与q2所指向的变量的值互换

if(*q1<*q3) swap(q1,q3);             //调用swap,将q1与q3所指向的变量的值互换

if(*q2<*q3) swap(q2,q3);             //调用swap,将q2与q3所指向的变量的值互换

}

 

voidswap(int*pt1,int*pt2)           //将pt1与pt2所指向的变量的值互换

{inttemp;

temp=*pt1;

*pt1=*pt2;

*pt2=temp;

}

 

例6.5 输出数组中的全部元素。

假设有一个整型数组a,有10个元素。要输出各元素的值有3种方法:

(1)下标法

#include <iostream>

usingnamespacestd;

intmain( )

{ inta[10];

inti;

for(i=0;i<10;i++)

cin>>a[i];                   //引用数组元素a[i]

cout<<endl;

for(i=0;i<10;i++)

cout<<a[i]<<" ";             //引用数组元素a[i]

cout<<endl;

return0;

}

运行情况如下:

9876543210↙            (输入10个元素的值)

9876543210              (输出10个元素的值)

(2) 指针法

将上面程序第7行和第10行的“a[i]”改为“*(a+i)”,运行情况与(1)相同。

(3) 用指针变量指向数组元素

#include <iostream>

usingnamespacestd;

intmain( )

{ inta[10];

inti,*p=a;           //指针变量p指向数组a的首元素a[0]

for(i=0;i<10;i++)

cin>>*(p+i);        //输入a[0]~a[9]共10个元素

cout<<endl;

for(p=a;p<(a+10);p++)

cout<<*p<<" ";      //p先后指向a[0]~a[9]

cout<<endl;

return0;

}

运行情况与前相同。请仔细分析p值的变化和*p的值。

 

例6.6 将10个整数按由小到大的顺序排列。

在例5.7程序的基础上,将形参改为指针变量。

#include <iostream>

usingnamespacestd;

intmain( )

{voidselect_sort(int*p,intn);                  //函数声明

inta[10],i;

cout<<"enter the originl array:"<<endl;

for(i=0;i<10;i++)                                //输入10个数

cin>>a[i];

cout<<endl;

select_sort(a,10);                              //函数调用,数组名作实参

cout<<"the sorted array:"<<endl;

for(i=0;i<10;i++)                               //输出10个已排好序的数

cout<<a[i]<<"  ";

cout<<endl;

return0;

}voidselect_sort(int*p,intn)                   //用指针变量作形参

{inti,j,k,t;

for(i=0;i<n-1;i++)

{k=i;

 for(j=i+1;j<n;j++)                    

if(*(p+j)<*(p+k)) k=j;                 //用指针法访问数组元素

 t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;

}

}

 

例6.7 输出二维数组各元素的值。

这里采用的方法是用基类型为整型的指针变量先后指向各元素,逐个输出它们的值。

#include <iostream>

usingnamespacestd;

intmain( )

{ inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;                              //p是基类型为整型的指针变量

for(p=a[0];p<a[0]+12;p++)

cout<<*p<<" ";

cout<<endl;

return0;

}

 

例6.8 输出二维数组任一行任一列元素的值。

#include <iostream>

usingnamespacestd;

intmain( )

{ inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int(*p)[4],i,j;

cin>>i>>j;

p=a;

cout<<*(*(p+i)+j)<<endl;

return0;

}

 

例6.9 输出二维数组各元素的值。

题目与例6.7相同,但本题用一个函数实现输出,用多维数组名作函数参数。

#include <iostream>

usingnamespacestd;

intmain( )

{ voidoutput(int(*p)[4]);                       //函数声明   

inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

output(a);                                  //多维数组名作函数参数

return0;

}

 

voidoutput(int(*p)[4])               //形参是指向一维数组的指针变量

{ inti,j;

for(i=0;i<3;i++)

for(j=0;j<4;j++) 

cout<<*(*(p+i)+j)<<" ";

cout<<endl;

}