例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;
}