📄 pointer.cpp
字号:
#include <iostream.h>
//【例6.1】指针变量的值和指针变量所指向的数据值
void main()
{
int i=2,*j=&i;
cout<<"i="<<i<<'\t'<<"j="<<(int)j<<'\t'<<"*j="<<*j<<endl;
i=5;
cout<<"i="<<i<<'\t'<<"j="<<(int)j<<'\t'<<"*j="<<*j<<endl;
*j=10;
cout<<"i="<<i<<'\t'<<"j="<<(int)j<<'\t'<<"*j="<<*j<<endl;
}
//【例6.2】指针的赋值运算
void main6_2()
{
int a=2,b=3;
int *pi1,*pi2;
pi1=&a; //A
pi2=&b; //B
cout<<"*pi1="<<*pi1<<'\t'<<"*pi2="<<*pi2<<'\n';
cout<<"pi1="<<pi1<<'\t'<<"pi2="<<pi2<<'\n';
pi2=&a; //C
a=4;
cout<<"*pi1="<<*pi1<<'\t'<<"*pi2="<<*pi2<<'\n';
cout<<"pi1="<<pi1<<'\t'<<"pi2="<<pi2<<'\n';
*pi2=4;
}
//【例6.3】不同类型指针变量之间的赋值运算
void main6_3()
{
int a=2,*b,*k=&a;
float c=2.3,*d;
b=(int *)&c;
d=(float *)k;
cout<<*b<<'\t'<<*d<<'\n';
}
//【例6.4】将整型常数赋给指针变量
void main6_4()
{
int *pi;
pi=(int *)20001;
pi=NULL;
//*pi=2; //error
int a=2;
pi=&a;
cout<<pi<<'\t'<<*pi<<'\n';
}
//【例6.5】指针变量的加减运算。
void main6_5()
{
int a[8]={1,2,3,4,5,6,7,8};
int *pi;
pi=&a[0];
cout<<"pi="<<(int)pi<<'\t'<<"*pi="<<*pi<<'\n';
pi=pi+6;
cout<<"pi="<<(int)pi<<'\t'<<"*pi="<<*pi<<'\n';
pi=pi-2;
cout<<"pi="<<(int)pi<<'\t'<<"*pi="<<*pi<<'\n';
}
//【例6.6】指针变量的++、--运算。
void main6_6()
{
int a[8]={10,20,30,40,50,60,70,80};
int *pi;
pi=&a[0];
pi++;
cout<<"*pi="<<*pi<<'\n';
pi=&a[0];
cout<<"*pi++="<<*pi++<<'\n';
pi=&a[0];
cout<<"*(pi++)="<<*(pi++)<<'\n';
pi=&a[0];
cout<<"*++pi="<<*++pi<<'\n';
pi=&a[0];
cout<<"(*pi)++="<<(*pi)++<<'\n';
pi=&a[0];
cout<<"++*pi="<<++*pi<<'\n';
}
//【例6.7】指针变量的关系运算
void main6_7()
{
int a[8]={1,2,3,4,5,6,7,8};
int *pi;
pi=0;
if(pi==0)
{
cout<<"指针pi为空!"<<'\n';
for(pi=&a[0];pi<=&a[7];pi++)
cout<<*pi<<'\t';
cout<<'\n';
}
else
{
cout<<*pi<<'\n';
}
}
//【例6.8】结构类型的指针变量应用举例。
#include <string.h>
struct person
{
char name[10];
unsigned age;
unsigned long id;
float salary;
};
void main6_8()
{
person per1;
person *per2=&per1;
strcpy(per2->name,"Mary");
per2->age=18;
per2->id=20021001;
per2->salary=2250.0;
cout<<per2->name<<'\t'<<per2->age<<'\t'<<per2->id<<'\t'
<<per2->salary<<'\n';
}
//【例6.9】利用指针访问数组中的元素
void main6_9()
{
int a[8]={1,2,3,4,5,6,7,8};
for(int i=0;i<8;i++)
cout<<a[i]<<'\t';
cout<<'\n';
for(i=0;i<8;i++)
cout<<*(a+i)<<'\t';
cout<<'\n';
int *pInt;
pInt=&a[0];
for(i=0;i<8;i++)
cout<<*pInt++<<'\t';
cout<<'\n';
pInt=a;
for(i=0;i<8;i++)
cout<<*(pInt+i)<<'\t';
cout<<'\n';
for(i=0;i<8;i++)
cout<<pInt[i]<<'\t';
cout<<'\n';
}
//【例6.10】二维数组与指针
void main6_10()
{
int a[4][3]={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
int i,j;
int *pInt;
pInt=&a[0][0];
cout<<"用指针变量输出数组a的所有元素(两种方法):\n";
for(i=0;i<12;i++)
{
cout<<*pInt++<<'\t';
if(!((i+1)%3))
cout<<'\n';
}
pInt=a[0];
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
cout<<*(pInt+i*3+j)<<'\t';
cout<<'\n';
}
cout<<"用另外两种方法输出数组a的所有元素:\n";
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
cout<<*(a[i]+j)<<'\t';
cout<<'\n';
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
cout<<*(*(a+i)+j)<<'\t';
cout<<'\n';
}
cout<<"用三种方法输出数组a的各行第0个元素的地址:\n";
for(i=0;i<4;i++)
cout<<&a[i][0]<<'\t';
cout<<'\n';
for(i=0;i<4;i++)
cout<<a[i]<<'\t';
cout<<'\n';
for(i=0;i<4;i++)
cout<<*(a+i)<<'\t';
cout<<'\n';
cout<<"用两种方法输出数组a的各行的行地址:\n";
for(i=0;i<4;i++)
cout<<a+i<<'\t';
cout<<'\n';
for(i=0;i<4;i++)
cout<<&a[i]<<'\t';
cout<<'\n';
}
//【例6.11】字符指针与一般指针的差异
void main6_11()
{
int i=2,*pInt;
pInt=&i;
*pInt=2;
char *pCh="China!";
char *pCh1;
pCh1="NanJing!";
cout<<pInt<<'\t';
cout<<*pInt<<'\n';
cout<<pCh<<'\t';
cout<<*pCh<<'\n';
pCh1++;
cout<<pCh1<<'\t';
cout<<*pCh1<<'\n';
}
//【例6.12】字符指针和字符数组应用比较
#include <string.h>
void main6_12()
{
char ch[]="Hello,World!";
char *pCh="NanJing,China!";
char ch1[20],ch2[20],ch3[20];
char *pCh1=ch1,*pCh2=ch2,*pCh3=ch3;
//利用循环语句逐字符实现数组的拷贝
for(int i=0;i<strlen(ch)+1;i++)
ch2[i]=ch[i];
cout<<ch2<<'\n';
//利用函数strcpy()实现数组的拷贝
strcpy(ch2,ch);
cout<<ch2<<'\n';
//利用赋值语句将一个字符数组名赋给一个指针变量
pCh1=ch;
cout<<pCh1<<'\n';
//利用赋值语句将一个指针变量赋给另一个指针变量
pCh1=pCh;
cout<<pCh1<<'\n';
//利用循环语句逐字符实现字符指针的拷贝
for(i=1;*pCh2++=*pCh++;i++);
*pCh2='\0';
pCh2-=i;
cout<<pCh2<<'\n';
//利用函数strcpy()实现字符串的拷贝
pCh-=i;
strcpy(pCh3,pCh);
cout<<pCh3<<'\n';
}
//【例6.13】指针数组的定义与使用
void main6_13()
{
int i[4];
int *pInt[4]={&i[0], &i[1], &i[2], &i[3]};
for(int j=0;j<4;j++)
*pInt[j]=j;
for(j=0;j<4;j++)
cout<<*pInt[j]<<'\t';
cout<<'\n';
}
//【例6.14】字符型指针数组的应用。
void main6_14()
{
char *pCh[]={"NanJing","BeiJing","WuHan","ShengYang"};
char *pCh1;
for(int i=0;i<3;i++)
for(int j=i+1;j<4;j++)
{
if(strcmp(pCh[i],pCh[j])>0)
pCh1=pCh[i],pCh[i]=pCh[j],pCh[j]=pCh1;
}
for(i=0;i<4;i++)
cout<<pCh[i]<<'\t';
cout<<'\n';
}
//【例6.15】指向数组的指针应用举例
void main6_15()
{
int a[4]={1,2,3,4};
int (*pInt)[4];
pInt=&a;
for(int i=0;i<4;i++)
cout<<(*pInt)[i]<<'\t';
cout<<'\n';
int b[4][3]={{11,12,13},{21,22,23},{31,32,33},{41,42,43}};
cout<<"利用指向数组的指针输出二维数组中的各个元素以及行地址:\n";
int (*pInt1)[3];
pInt1=b;
for(i=0;i<4;i++)
{
for(int j=0;j<3;j++)
cout<<(*pInt1)[j]<<'\t';
cout<<(int)pInt1<<'\n';
pInt1++;
}
cout<<"利用各种不同的方法通过指向数组的指针输出数组b中的各个元素:\n";
pInt1=&b[0];
for(i=0;i<4;i++)
{
for(int j=0;j<3;j++)
cout<<*(*(pInt1+i)+j)<<'\t'<<*(pInt1[i]+j)<<'\t'
<<pInt1[i][j]<<'\n';
}
int (*ptr2)[2][3];
int aa[2][2][3]={1,2,3,4,5,6,7,8,9,10,11,12};
ptr2=aa;
cout<<(*ptr2)[0][2]<<endl;
ptr2++;
cout<<(*ptr2)[1][2]<<endl;
}
//【例6.16】指向多维数组的指针
void main6_16()
{
int (*ptr2)[2][3];
int aa[2][2][3]={1,2,3,4,5,6,7,8,9,10,11,12};
ptr2=aa;
cout<<(*ptr2)[0][2]<<'\t'; //A
ptr2++;
cout<<(*ptr2)[1][2]<<'\n'; //B
}
//【例6.17】多级指针的使用
void main6_17()
{
char *pCh="NanJing";
char *pCh1[]={"China","Japan","Korea","Iran","Iraq"};
char **pCh2;
pCh2=&pCh;
cout<<*pCh2<<'\n';
pCh2=pCh1;
for(int i=0;i<5;i++)
cout<<*pCh2++<<'\t';
cout<<'\n';
}
//【例6.18】通过指针作为函数的参数实现两个数据的交换
void Swap(int *pInt1, int *pInt2)
{
int *temp;
temp=pInt1;
pInt1=pInt2;
pInt2=temp;
}
void main6_18()
{
int a=2,b=4;
int c=20,d=40,*x=&c,*y=&d;
cout<<"交换前:\n";
cout<<"a="<<a<<"\tb="<<b<<'\n';
cout<<"*x="<<*x<<"\t*y="<<*y<<'\n';
Swap(&a,&b);
Swap(x,y);
cout<<"交换后:\n";
cout<<"a="<<a<<"\tb="<<b<<'\n';
cout<<"*x="<<*x<<"\t*y="<<*y<<'\n';
}
//【例6.19】编写一个函数,具有两个字符指针类型的参数,
//判断第二个参数是否包含在第一个参数中,若包含,则返回其位置,否则返回-1。
int index(char *s,char *t)
{
int i,j,k;
for(i=0;s[i]!='\0';i++)
{
j=i;
for(k=0;t[k]!='\0';k++)
{
if(s[j]!=t[k])
break;
j++;
}
if(t[k]=='\0')
return i;
}
return -1;
}
void main6_19()
{
int n;
char str1[20],str2[20];
cout<<"输入一个英语单词:";
cin>>str1;
cout<<"输入另一个英语单词:";
cin>>str2;
n=index(str1,str2);
if(n!=-1)
cout<<str2<<"在"<<str1<<"中左起第"<<n+1<<"个位置。"<<'\n';
else
cout<<str2<<"不在"<<str1<<"中。"<<'\n';
}
//【例6.20】设计一个程序,求二维数组的平均值
float average1(float *p, int n)
{
int i;
float sum=0;
for(i=0;i<n;i++)
sum+=*p++;
return sum/n;
}
float average2(float p[][4],int n)
{
int i,j;
float sum=0;
for(i=0;i<n;i++)
for(j=0;j<4;j++)
sum+=p[i][j];
return sum/(n*4);
}
float average3(float (*p)[4],int n)
{
int i,j;
float sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<4;j++)
sum+=(*p)[j];
p++;
}
return sum/(n*4);
}
void main6_20()
{
float a[][4]={{11,12,13,14},{21,22,23,24},{31,32,33,34}};
cout<<"用函数average1()计算的平均值为:"<<average1(a[0],12)<<'\n';
cout<<"用函数average2()计算的平均值为:"<<average2(a,3)<<'\n';
cout<<"用函数average3()计算的平均值为:"<<average3(a,3)<<'\n';
}
//【例6.21】构造一个函数实现对字符串的排序。
void sort1(char *pCh[],int n)
{
char *pCh1;
int k;
for(int i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
if(strcmp(pCh[k],pCh[j])>0)k=j;
if(i!=k)
pCh1=pCh[i],pCh[i]=pCh[k],pCh[k]=pCh1;
}
}
void sort2(char **pCh,int n)
{
char *pCh1;
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
if(strcmp(pCh[i],pCh[j])>0)
pCh1=pCh[i],pCh[i]=pCh[j],pCh[j]=pCh1;
}
}
void main6_21()
{
char *pCh[]={"NanJing","BeiJing","WuHan","ShengYang"};
sort1(pCh,4);
for(int i=0;i<4;i++)
cout<<pCh[i]<<'\t';
cout<<'\n';
char *pCh1[]={"JiangSu","SiChuan","ShanDong","LiaoNing","HeBei"};
sort2(pCh1,5);
for(i=0;i<5;i++)
cout<<pCh1[i]<<'\t';
cout<<'\n';
}
//【例6.22】设计一个程序,将输入的一串字符按其逆序输出。
char str[80];
char *temp=str;
char *convert1(const char *ptr)
{
int length=strlen(ptr);
ptr+=length-1;
for(int i=0;i<length;i++)*temp++=*ptr--;
*temp+='\0';
temp-=length;
return temp;
}
char *convert2(char *ptr)
{
char *ptr1,*ptr2,temp;
ptr1=ptr,ptr2=ptr;
while(*ptr2++);
ptr2-=2;
while(ptr1<ptr2)
temp=*ptr1,*ptr1++=*ptr2,*ptr2--=temp;
return ptr;
}
void convert3(char *ptr,int n)
{
if(ptr[n]!=0)convert3(ptr,n+1);
cout<<ptr[n];
}
void main6_22()
{
char str[80];
char *ptr=str;
cout<<"输入一串字符:";
cin>>ptr;
cout<<"该字符串的反序为:";
cout<<convert1(ptr)<<'\n';
cout<<ptr<<'\n';
cout<<"输入一串字符:";
cin>>ptr;
cout<<"该字符串的反序为:";
cout<<convert2(ptr)<<'\n';
cout<<ptr<<endl;
cout<<"输入一串字符:";
cin>>ptr;
cout<<"该字符串的反序为:";
convert3(ptr,0);
cout<<'\n';
}
//【例6.23】通过改变函数的返回值改变它所指向的存储单元的值。
int I=0;
int *fun1()
{
return &I;
}
int *fun2(int *ptr)
{
return ptr;
}
void main6_23()
{
*fun1()=10;
cout<<I<<'\n';
int k=3;
*fun2(&k)=5;
cout<<k<<'\n';
}
//【例6.24】设计一个程序,输出命令行参数。
void main6_24(int argc, char *argv[])
{
for(int i=0;i<argc;i++)
cout<<"argv["<<i<<"]="<<argv[i]<<'\n';
}
//【例6.25】利用例6.21中的字符串排序函数,将命令行参数作为其实参。
void sort(char *pCh[],int n)
{
char *pCh1;
int k;
for(int i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
if(strcmp(pCh[k],pCh[j])>0)k=j;
if(i!=k)
pCh1=pCh[i],pCh[i]=pCh[k],pCh[k]=pCh1;
}
}
void main6_25(int argc, char *argv[])
{
sort(argv+1,argc-1);
for(int i=1;i<argc;i++)
cout<<argv[i]<<'\t';
cout<<'\n';
}
//【例6.26】设计一个程序,实现两个数的加、减、乘、除四则运算。
#include <stdlib.h>
float add(float x,float y)
{
return x+y;
}
float sub(float x,float y)
{
return x-y;
}
float mul(float x,float y)
{
return x*y;
}
float dev(float x,float y)
{
if(y!=0)
return x/y;
else
{
cout<<"除数不能为0\n";
exit(1);
}
}
void main6_26()
{
float a,b;
char c;
float (*pf)(float,float);
cout<<"输入计算式,格式为:操作数1 运算符 操作数2:\n";
cin>>a>>c>>b;
switch(c){
case '+':pf=add;break;
case '-':pf=sub;break;
case '*':pf=mul;break;
case '/':pf=dev;break;
default:cout<<"输入数据格式不对!"<<'\n';exit(1);
}
cout<<a<<c<<b<<"="<<pf(a,b)<<'\n';
}
//【例6.27】设计一个菜单驱动函数调用的程序。
typedef void(*fp)();
void menu1()
{
cout<<"Good!\n\n";
}
void menu2()
{
cout<<"Better!\n\n";
}
void menu3()
{
cout<<"Best!\n\n";
}
void main6_27()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -