您的位置:首页 > 其它

指针基础总结

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: