指针基础总结
2010-02-07 00:19
176 查看
//1.输入a和b两个整数,按先后大小的顺序输出a和b的值 #include <stdio.h> void main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;} printf("a=%d,b=%d/n/n",a,b); printf("max=%d,min=%d/n",*p1,*p2); }
//2.对输入的两个整数按大小顺序输出 #include <stdio.h> void main() { void swap(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("/n%d,%d/n",a,b); } void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } //用指针变量作函数参数,来使在函数中改变了的变量值能被main函数使用 //假如swap替换成: //void swap(int *p1,int *p2) //{ // int *p // p=p1; // p1=p2; // p2=p; //}结果不变 //不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值
//3.将数组a中n个整数按相反顺序存放 #include <stdio.h> void main() { void inv(int *x,int n); int i,a[10]={3,7,9,11,0,6,7,5,4,2}; printf("The original array:/n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("/n"); inv(a,10); printf("The array has been inverted:/n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("/n"); } void inv(int *x,int n) { int *p,temp,*i,*j,m=(n-1)/2; i=x; j=x+n-1;//因为C语言的数组下标是从0开始的 p=x+m; for(;i<=p;i++,j--) { temp=*i;*i=*j;*j=temp;} return; } //如果n是偶数2K,需要做的循环次数是k次; //如果n是奇数2K-1,需要做的循环次数是k次; //这里需要注意,偶数的时候必须满足k次循环,当奇数时,做第k次循环 //时,无非是跟自身做对换,不影响结果。
//4.输出二维数组有关的值 #include <stdio.h> #define FORMAT "%d,%d/n" void main() {int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; printf(FORMAT,a,*a); printf(FORMAT,a[0],*(a+0)); printf(FORMAT,&a[0],&a[0][0]); printf(FORMAT,a[1],a+1); printf(FORMAT,&a[1][0],*(a+1)+0); printf(FORMAT,a[2],*(a+2)); printf(FORMAT,&a[2],a+2); printf(FORMAT,a[1][0],*(*(a+1)+0)); } /*0x0012FF50 0x0012FF50 0x0012FF50 0x0012FF50 0x0012FF50 0x0012FF50 0x0012FF60 0x0012FF60 0x0012FF60 0x0012FF60 0x0012FF70 0x0012FF70 9 9 */
//5.有一个班,3个学生,各学4门课,计算总平均分数以及第那个学生的成绩 #include <stdio.h> void main() {void average(float *p,int n); void search(float (*p)[4],int n); float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}}; average(*score,12);//*score和&a[0][0]都是相同道理,都表示该元素的地址值 search(score,2); } void average(float *p,int n) {float *p_end; float sum=0,aver; p_end=p+n-1; for(;p<=p_end;p++) sum=sum+(*p); aver=sum/n; printf("average=%5.2f/n",aver); } //average函数是通过二维数组元素的累加求和,最终求平均所得出结果的, //这里要尤其注意二维数组中指针的表示方法 void search(float (*p)[4],int n) {int i; printf("the score of No.%d are:/n",n); for(i=0;i<4;i++) printf("%5.2f ",*(*(p+n)+i)); }
//6.查找一门以上不及格的学生,输出他们的全部课程的成绩 #include <stdio.h> void main() { void search(float (*p)[4],int n); float score[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}}; search(score,3);//socre,score+i都是指向行的指针,因而用指向一维数组的指针作形参 } void search(float (*p)[4],int n) { int i,j,flag; for(j=0;j<n;j++) { flag=0; for(i=0;i<4;i++) if(*(*(p+j)+i)<60) flag=1; if(flag==1) { printf("No.%d fails,his scores are:/n",j+1); for(i=0;i<4;i++) printf("%5.1f ",*(*(p+j)+i)); printf("/n"); } } } //通过flag的取值0或者来判断某学生的成绩是否应该被输出 //伪代码: //if 小于60分 flag=1 // 输出该学生的学号和所有成绩
//7.将字符串a赋值给b字符串 #include <stdio.h> void main() { char a[ ]="I am a boy.",b[20]; int i; for(i=0;*(a+i)!='/0';i++) *(b+i)=*(a+i); // while(*(a+i)!='/0') // *(b+i)=*(a+i); //*(a+i)!='/0',*(a+i)!=0,*(a+i),三者等价 *(b+i)='/0'; printf("string a is:%s/n",a); printf("string b is:"); for(i=0;b[i]!='/0';i++) printf("%c",b[i]); printf("/n"); } //定义一个指定大小的数组,通过*(b+i)=*(a+i)的形式逐个将a数组的元素赋值给b数组, //知道*(a+i)='/0'为止,为使b数组彻底与a数组相同内容,最终把空字符赋值给第(n+1)元素 //(假设有n个有效字符)
//8.求最大值,最小值及求和 #include <stdio.h> void main() { int max(int,int); int min(int,int); int add(int,int); void process(int x,int y,int (*fun)(int,int)); int a,b; printf("enter a and b:"); scanf("%d,%d",&a,&b); printf("max="); process(a,b,max); printf("min="); process(a,b,min); printf("sum="); process(a,b,add); } 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 process(int x,int y,int (*fun)(int,int)) { int result; result=(*fun)(x,y); printf("%d/n",result); } //process函数利用指向函数的指针来分别调用其他的功能函数,返回函数值,最终把结果输出
//9.找出不及格课程的学生及其学生号 #include <stdio.h> void main() { float score[ ][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}}; float *search(float (*pointer)[4]); float *p; int i,j; for(i=0;i<3;i++) { p=search(score+i); if(p==*(score+i)) { printf("No.%d scores: ",i); for(j=0;j<4;j++) printf("%5.2f ",*(p+j)); printf("/n");} } } float *search(float (*pointer)[4]) { int i; float *pt; pt=*(pointer+1); for(i=0;i<4;i++) if(*(*pointer+i)<60) pt=*pointer; return(pt); } //search函数的伪代码: //先给pt指针初始化为*(pointer+1), //if 该行上的元素至少有一个小于60 // 把作为形参的指向一维数组的指针赋值给pt指针 //else // 返回原来初始化的值 //在主函数中: //if p指针是主函数中开始被赋的值 // 满足条件输出各课成绩及序号
//10.有若干个学生的成绩(每个学生有4门课程),要求在用户输入序号以后, //能输出该学生的全部成绩 #include <stdio.h> void main() { float score[ ][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}}; float *search(float (*pointer)[4],int n); //float *search(float (*pointer)[4],int n)与 //float (*search)(float (*pointer)[4],int n) //的区别,前者返回的是指针,后者则是数据类型。 float *p; int i,m; printf("enter the number of student:"); scanf("%d",&m); printf("The scores of No.%d are:/n",m); p=search(score,m); for(i=0;i<4;i++) printf("%5.2f/t",*(p+i)); } float *search(float (*pointer)[4],int n) { float *pt; pt=*(pointer+n); return(pt); } //指向一维数组的指针指向二维数组的行,选择并返回行的首地址,最终把改首地址赋值给 //一个相同类型的指针变量,对其进行逐一递增并同时输出相应元素的值。
//11.将若干字符串按字母顺序输出 #include <stdio.h> #include <string.h> void main() { void sort(char *name[ ],int n); void print(char *name[ ],int n); char *name[ ]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; //char *name[4]与char (*name)[4]两者的区别,前者是指针数组,即每一个元素都可指向 //char型的指针变量,后者是一个指向一维数组的char型指针变量 int n=5; sort(name,n); print(name,n); } void sort(char *name[ ],int n) { char *temp; int i,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)//当ki时,减少执行的代码 {temp=name[i]; name[i]=name[k]; name[k]=temp;} //没有什么不安全,因为改变的是指针变量本身的值 } } void print(char *name[ ],int n) { int i=0; char *p; p=name[0];//如果是整型的二维数组就有问题了,因为左右类型不匹, //该段代码其实只是起个初始化作用 while(i<n) { p=*(name+i++);//name首先是个数组,即(name+1)就意味着第1行首地址 printf("%s/n",p); } } //sort函数: //给k赋初值i(假设从0开始,作n次循环),然后依次在第(i+1)与第(n-1)之间的数求出最值
//12.指针的指针 #include <stdio.h> void main() { char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; char **p;//指向一个字符指针变量的指针 int i; for(i=0;i<5;i++) { p=name+i; printf("%s/n",*p); } }
相关文章推荐
- C语言中 指针的基础知识总结, 指针数组的理解
- C++基础知识总结--指针
- C++基础总结(4)-----指针
- com基础知识总结, 智能指针,匈牙利命名法
- C++基础总结(4)-----指针
- c++指针基础总结
- 黑马程序员——C语言基础学习(四)---数组和指针的总结学习
- C/C++基础知识总结——数组、指针域、字符串
- C语言指针基础知识总结
- 总结:程序设计基础
- javaweb学习总结(十五)——JSP基础语法
- Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)
- Python黑客零基础好入门吗?来自月收入5w的老骇客的入门总结!
- 关于 android 基础知识的总结 之 定时器
- Javascript基础知识盲点总结——数据类型和数组
- C陷阱和指针基础(三)
- Java多线程编程总结笔记——一多线程基础知识
- 黑马程序员-----------C语言基础-----------指针(二)
- 指针基础
- C++基础概念总结(一)