第六章作业
2014-05-16 09:25
176 查看
作业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; }