⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pointer.cpp

📁 这我们老师对是面向对象程序设计(清华大学出版社)一书制作的PPT
💻 CPP
📖 第 1 页 / 共 2 页
字号:


#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 + -