作业1
例题6.1 举例说明了指针的几种表示形式,*p指向指针指向的变量,&p指向该变量的存储地址,
/**********************************
** 例题6.1 指针的几种形式 **
** 自动化1121 李庆典 **
**********************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main()
{
int a =10;
int * p;
p=&a;
cout<<" a = "<<a<<endl;
cout<<" p = "<<p<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
cout<<endl;
* p=15;
cout<<" a = "<<a<<endl;
cout<<" p = "<<p<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
return 0;
}
运行结果如下 可以看出&a与p是指向相同的地址,并且此时*p=a的值,但是这个p本身的存储位置是在0012FF78的,并不是与a的存储地址相同
例题6.2
运用指针的形式对比两个数据大小,这里是用到了更改指针指向地址来达到程序目的的,这样做的好处就是不会更改原先的数据,仅仅是更改我们定义的指针来达到输出排序后的数据的目的\
/**********************************
** 例题6.2 **
** 自动化1121 李庆典 **
**********************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int a,b;
int *p=&a,* q=&b,* tp;
cout<<"请输入两个数:";
cin>>a>>b;
if (a<b)
{
tp=p;p=q;q=tp; //依据大小来更改指针的指向地址
}
cout<<"初始的两个数为:"<<a<<'\t'<<b<<endl;
cout<<"排序之后的数为:"<<* p<<'\t'<<* q<<endl;
return 0;
}
这里 例题6.3也是类似的题目,不同的是 这里用指针来改变了a,b的值,此时p和q指向的地址依旧不变,变的只是a,b的实际的值
/**********************************
** 例题6.3 **
** 自动化1121 李庆典 **
**********************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int a,b,tp;
int *p=&a,* q=&b;
cout<<"请输入两个数:";
cin>>a>>b;
cout<<"初始的两个数为:"<<a<<'\t'<<b<<endl;
if (a<b)
{
tp=*p;*p=*q;*q=tp;
}
cout<<"排序之后的数为:"<<a<<'\t'<<b<<endl;
cout<<"排序之后的数为:"<<*p<<'\t'<<*q<<endl;
return 0;
}
例题6.4 指针的关系运算
/**********************************
** 例题6.4 指针的关系运算 **
** 自动化1121 李庆典 **
**********************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制流头文件
using namespace std; //标准名字空间
int main() //主函数
{
int a=10,b=10,*part1,*part2;
part1=&a;
part2=&b;
cout<<boolalpha<<(*part1 ==*part2)<<endl;
cout<<boolalpha<<(part1 == part2)<<endl;
return 0;
}
例题6.5
三种方法输出数组的值
/**********************************
** 例题6.5 三种方法输出数组 **
** 自动化1121 李庆典 **
**********************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制流头文件
using namespace std; //标准名字空间
int main() //主函数
{
int a[10];
for(int i=0;i<10;i++)
a[i]=2*(i+1); //为数组赋值
for(i=0;i<10;i++) //方法1 下标法
cout<<setw(4)<<a[i];
cout<<endl;
for(i=0;i<10;i++)
*(a+1)=2*(i+1);
for(i=0;i<10;i++) //数组名法求地址后输出
cout<<setw(4)<<*(a+i);
cout<<endl;
int *p =&a[0];
for(p =a,i=0;p<a+10;p++,i++)
*p=2*(i+1);
for(p=a;p<a+10;p++) //指针指向数组
cout<<setw(4)<<*p;
cout<<endl;
return 0;
}
例题6.6
/*************************************************
** 例题6.6 用指针变量实现字符串赋值 **
** 自动化1121 李庆典 **
*************************************************/
#include<iostream> //预编译处理命令
#include <cmath> //标准c语言函数库
using namespace std; //标准名字 空间
int main()
{
char a[]= "Hello world",b[20],*p,*q;
p=a,q=b;
for (;*p!='\0';p++,q++)
{
*q=*p;
}
*q='\0';
cout<<"string1 is:";
cout<<a<<endl;
cout<<"string2 is:";
cout<<b<<endl;
return 0;
}
例题6.7
/*******************************************
** 例题6.9 利用指针相减来计算字符长度 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char*p="student";
for (;*p!='\0';p++)
{
cout<<p<<endl;
}
return 0;
}
例题 6.8
/*******************************************
** 例题6.8 用下标来引用字符 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main()
{
char *p="student";
for (int i= 0;p[i]!='\0';i++)
{
cout<<p[i];
}
cout<<endl;
return 0;
}
例题6.9
/*******************************************
** 例题6.9 利用指针相减来计算字符长度 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char s[50];
char *p;
cout<<"请输入一个字符串:";
cin.get(s,50);
p=s; //取数组s的首地址,即s[0]
for (;*p!='\0';)
p++;
cout<<"该字符串的长度为:"<<p-s<<endl;
return 0;
}
例题6.10
/*******************************************
** 例题6.10 多级指针的应用 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int i=5,*p,**pp;
p=&i;
pp=&p;
cout<<&i<<'\t'<<i<<endl;
cout<<&p<<'\t'<<p<<'\t'<<*p<<endl;
cout<<&p<<'\t'<<pp<<'\t'<<*pp<<'\t'<<**pp<<endl;
return 0;
}
例题6.11
/*******************************************
** 例题6.11 指针数组举例 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int a[5]={1,2,3,4,5
};
int *p[5]={&a[0],&a[1],&a[2],&a[3],&a[4]
};
for (int i =0;i<5;i++)
{
cout<<*p[i]<<'\t';
}
cout<<endl;
return 0;
}
例题6.12
/*******************************************
** 例题6.12 字符指针数组的举例 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char a[]="computer system",b[]="hardware",c[]="software";
char *p[4];
p[0]=a; //定义指针的指向
p[1]=b;
p[2]=c;
p[3]=NULL;
for (int i=0;p[i]!=NULL;i++)
{
cout<<p[i]<<endl;
}
cout<<endl;
return 0;
}
例题6.13
/*******************************************
** 例题6.13 用字符串来初始化字符指针数组**
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char *weeekn[]={"Sunday","Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday"
};
int i;
while (1)
{
cout<<"please input week No : ";
cin>>i;
if(i<0||i>6)
break;
cout<<"week NO."<<i<<"----"<<weeekn[i]<<endl;
}
cout<<endl;
return 0;
}
例题6.14
/*******************************************
** 例题6.14 字符串排序 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char *p[]={"beijing","guangzhou","jieyang"
};
char *t;
int i,j,n=4;
for(i=0;i<n-1;i++) //冒泡法排序
for(j=0;j<n-1;j++)
if (strcmp(p[j],p[j+1])>0)
{
t=p[j],p[j]=p[j+1];p[j+1]=t;
}
for(i=0;i<n;i++)
cout<<p[i]<<endl;
cout<<endl;
return 0;
}
例题6.15
/*******************************************
** 例题6.15 用指针数组处理二维数组 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int a[2][3],*p[2];
int i,j;
p[0]=a[0];
p[1]=a[1];
for(i=0;i<2;i++)
for(j=0;j<3;j++)
a[i][j]=j+1;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
cout<<"a["<<i<<"]["<<j<<"] : ";
cout<<*(p[i]+j)<<endl;
}
cout<<endl;
return 0;
}
例题6.17
/*******************************************
** 例题6.17 用指针数组处理多个二维数组 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char * a[]={"rebacca","Heavean","MIchael chang",NULL};
char ** pp;
pp=a;
while(* pp != NULL)
cout<<* pp++<<endl;
return 0;
}
例题6.18
这里要注意指针数组与数组指针的区别
int * p[3] 为一个指针数组,指一个数组
int (*p)[3] 为一个数组指针,为一个指针,一个数组的指针,输出一个一维数组的指针
/*******************************************
** 例题6.18 用数组指针处理二维数组 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
int main() //主函数
{
int a[2][3]={1,2,23,4,5,6};
int (*p)[3]; //一个一维数组指针
int i,j;
p=a;
for (i=0;i<2;i++)
{
for (j=0;j<3;j++)
{
cout<<setw(3)<<(*p)[j];
}
p++;
}
cout<<endl;
return 0;
}
例题6.19
/*******************************************
** 例题6.19 用指针来作为函数参数举例 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
void dia(int *,int *);
int main() //主函数
{
int a=5,b=10;
int *pa=&a; //赋给地址,使*pa指向a的值
int *pb=&b;
dia(pa,pb); //作为实参,调用另一函数
cout<<endl;
return 0;
}
void dia(int *p1,int*p2)
{
cout<<"第一个数为: "<<*p1<<endl;
cout<<"第二个数为: "<<*p2<<endl;
}
例题6.20
/*******************************************
** 例题6.20 用指针来转换大小写 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
void dia(char *c);
int main() //主函数
{
char ch;
cout<<"请输入一个字母:";
cin>>ch;
dia(&ch) ; //取出ch的地址
cout<<"转换后的小写字母为:";
cout<<ch<<endl;
return 0;
}
void dia(char *pch) //自定义函数
{
if(*pch>='A'&&*pch <='Z')
*pch +='a'-'A';
}
例题6.21
/*******************************************
** 例题6.201 用指针来实现两个数据的互换 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
void dia(int *,int *);
int main() //主函数
{
int a=3,b=4;
cout<<"交换前的数据为: ";
cout<<"a = "<<a<<"\tb = "<<b<<endl;
dia(&a,&b);
cout<<"交换后的数据位: ";
cout<<"a = "<<a<<"\tb = "<<b<<endl;
return 0;
}
void dia(int *u,int *v) //自定义函数
{
int t=*u;
*u=*v;
*v=t;
}
例题6.22
/*******************************************
** 例题6.22 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
void inpue(int *s,int n);
int min(int *s,int n);
int main() //主函数
{
int a[10],small;
inpue(a,10);
small=min(a,10);
cout<<"数组中最小的值为 :"<<small<<endl;
return 0;
}
void inpue(int *s,int n)
{
cout<<"请输入"<<n<<"个数值:"<<endl;
for (int i=0;i<n;i++)
cin>>s[i];
}
int min(int *s,int n)
{
int min ,i;
min= *s;
for(i=1;i<n;i++)
if (s[i]<min)
min=s[i];
return min;
}
例题6.23
/*******************************************
** 例题6.23 利用指针变量调用函数 **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
int main() //主函数
{
int fun(int a,int b);
int (* pf)(int a, int b);
pf=fun;
cout<<"请输入两个数"<<endl;
int m,n;
cin>>m>>n;
int re =(*pf)(m,n);
cout<<"输出结果为"<<re<<endl;
return 0;
}
int fun(int a,int b)
{
return a+b;
}
例题6.24
函数指针,用来指定一个函数的入口地址
形式为 数据类型(*指针变量名)(形参列表);
/*******************************************
** 例题6.24 课本一个比较长的题目(函数指针) **
** 自动化1121 李庆典 **
*******************************************/
#include <iostream> //预编译处理命令
#include <iomanip> //控制符处理文件
using namespace std; //标准名字空间
int max(int,int);
int min(int,int);
int add(int,int);
void pro(int, int ,int (*fun)(int,int));//一个函数指针
int main() //主函数
{
int a,b;
cout<<"enter a and b :"<<endl;
cin>>a>>b;
cout<<"max = "
<<pro(a,b,max)
<<endl;
cout<<"min = "
<<pro(a,b,min)
<<endl;
cout<<"sum = "
<<pro(a,b,add)
<<endl;
return 0;
}
int max(int x,int y)
{
int z;
if (x>Y) z=x;
else z=y;
return z;
}
int min(int x,int y)
{
int z;
if(x<y) z=x;
else z=y;
return z;
}
int add(int x,int y)
{
int z;
z=x+y;
return z;
}
void pro(int x,int y,int(*fun)(int,int))
{
int re;
re = (*fun)(x,y);
cout<<re<<endl;
}