学习编程的第七天(指针学习)

指针:
*是取指;&是地址

如:pointer=&a; &*pointer等价于&a,&和*优先级相同,遵循自右向左结合。

*&pointer等价于a;

*(p+i)+j:表示i行j列的地址;    *(*(p+j)+j):表示的是i行j列的数值;

输入两个数,由大到小输出:
 

#include<stdio.h>
void main()
{
	void exchange(int *x,int *y);
	int a,b;
	int *x,*y;
	x=&a;
	y=&b;
	printf("please input the numbers:\n");
	scanf("%d%d",&a,&b);
	if(a<b)
	{
		exchange(x,y);
	}
		printf(" %d > %d \n",a,b);
}
void exchange(int *x,int *y)
{
	int z;
	if(*x<*y)
	{
		z=*x;
		*x=*y;
		*y=z;
	}
}

输入a,b,c三个数,按由大到小的顺序输出;

#include<stdio.h>   //方法一
void main()
{
	void exchange(int *x,int *y);
	int a,b,c;
	int *x,*y,*z;
	x=&a;
	y=&b;
	z=&c;
	printf("please input the numbers:\n");
	scanf("%d%d%d",&a,&b,&c);
	if(a<b)
	{
		exchange(x,y);
	}
	if(a<c)
	{
		exchange(x,z);
	}
	if(b<c)
	{
		exchange(y,z);
	}
		printf(" %d > %d > %d \n",a,b,c);
}
void exchange(int *x,int *y)
{
	int z;
	if(*x<*y)
	{
		z=*x;
		*x=*y;
		*y=z;
	}
}
#include<stdio.h>     //方法二
void main()
{
	void exchange(int *x,int *y,int *z);
	int a,b,c;
	int *x,*y,*z;
	x=&a;
	y=&b;
	z=&c;
	printf("please input the numbers:\n");
	scanf("%d%d%d",&a,&b,&c);
	exchange(x,y,z);
	printf(" %d > %d > %d \n",a,b,c);
}
void exchange(int *x,int *y,int *z)
{
	int temp;
	if(*x<*y)
	{
		temp=*x;
		*x=*y;
		*y=temp;
	}
	if(*x<*z)
	{
		temp=*x;
		*x=*z;
		*z=temp;
	}
	if(*y<*z)
	{
		temp=*y;
		*y=*z;
		*z=temp;
	}
}
#include<stdio.h>            //方法三
void main()
{
	void exchange(int *x,int *y,int *z);
	void swap(int * w,int *u);
	int a,b,c;
	int *x,*y,*z;
	x=&a;
	y=&b;
	z=&c;
	printf("please input the numbers:\n");
	scanf("%d%d%d",&a,&b,&c);
	exchange(x,y,z);
	printf(" %d > %d > %d \n",a,b,c);
}
void exchange(int *x,int *y,int *z)
{
	if(*x<*y)
	{
		swap(x,y);
	}
	if(*x<*z)
	{
		swap(x,z);
	}
	if(*y<*z)
	{
		swap(y,z);
	}
}
void swap(int *w,int *u)
{
	int temp;
	temp=*w;
	*w=*u;
	*u=temp;
}

定义一个数组a[10]={9,8,7,6,5,4,3,2,1,0},输出在这个数组

数组a[],其中a就表示数组的首地址;

#include<stdio.h>     //定义指针P输出
void main()
{
	int a[10]={9,8,7,6,5,4,3,2,1,0};
	int *p;
	int i;
	p=&a[0];
	for(i=0;i<10;i++)
	{
		printf("%d  ",*(p+i));
	}
}
#include<stdio.h>      //用数组的原始定义输出
void main()
{
	int a[10]={9,8,7,6,5,4,3,2,1,0};
	int *p;
	int i;
	for(i=0;i<10;i++)
	{
		printf("%d  ",*(a+i));
	}
}

将a[10]={0,1,2,3,4,5,6,7,8,9}倒过来存储并输出

#include<stdio.h>    //方法一
void main()
{
	int a[10]={0,1,2,3,4,5,6,7,8,9};
	int *p;
	int i;
	p=&a[9];
	for(i=0;i<10;i++)
	{
		printf("%d  ",*(p-i));
	}
}
#include<stdio.h>    //方法二
void main()
{
	void exchange(int *x,int n);  //指针做形参
	int a[10]={0,1,2,3,4,5,6,7,8,9};
	int i;
	exchange(a,10);
	for(i=0;i<10;i++)
	{
		printf("%d  ",*(a+i));
	}
}
void exchange(int *x,int n)
{
	int temp;
	int m,i,j;
	m=n/2;
	for(i=0;i<m;i++)
	{
		j=n-1-i;
		temp=x[i];
		x[i]=x[j];
		x[j]=temp;
	}
}

输入一组数组,求出最大值和最小值。

#include<stdio.h>
void main()
{
	void find(int *x,int n);
	int a[10]={1,22,45,13,87,6,8,12,98,4};
	int i;
	find(a,10);
	printf("max=%d  min=%d\n",a[0],a[9]);
}
void find(int *x,int n)
{
	int temp;
	int i,j;
	for(i=0;i<9;i++)  //冒泡排序法
	{
		for(j=0;j<9-i;j++)
		{
			if(x[j]<x[j+1])
			{
				temp=x[j];
				x[j]=x[j+1];
				x[j+1]=temp;
			}
		}
	}
}

有一组数组,从键盘输入行和列,打印出对应的数字。

#include<stdio.h>
void main()
{
	int a[3][4]={{1,22,45,13},{87,6,8,12},{98,4,8,9}};
	int x,y;
	int *p;
	printf("please input the hang x=,lie y=\n");
	scanf("%d%d",&x,&y);
	p=&a[x][y];
	printf("%d\n",*p);
}

打印一个字符串

#include<stdio.h>
void main()
{
	char string[]="I love China!";
	printf("%s\n",string);
}
#include<stdio.h>
void main()
{
	char *string="I love China!";
	printf("%s\n",string);
}

将字符串A复制给字符串B

#include<stdio.h>
void main()
{
	char *string="I love China!",b[30];
	int *p1,*p2;
	int i;
	p1=string;
	p2=b;
	for(;*p1!='\0';p1++,p2++)
	{
		*p2=*p1;
	}
	*p2='\0';
	printf("the string a = %s\n",string);
	printf("the string b = ");
	for(i=0;b[i]!='\0';i++)
	{
		printf("%c",b[i]);
	}
	printf("\n");
	
}
#include<stdio.h>     //用字符数组作为参数传递
void main()
{
	void copy(char x[],char y[]);
	char a[]="I love China!";
	char b[]="I love my wife!";
	printf("the string a is:%s\n",a);
	printf("the string b is:%s\n",b);
	printf("then copy b to a :\n");
	copy(a,b);
	printf("the string a is:%s\n",a);
	printf("the string b is:%s\n",b);	
}
void copy(char x[],char y[])
{
	int i=0;
	while(y[i]!='\0')
	{
		x[i]=y[i];
		i++;
	}
	x[i]='\0';
}
#include<stdio.h>      //以指针为参数传递
void main()
{
	void copy(char *x,char *y);
	char a[]="I love China!";  //a数组要被写,所以不能定义为指针,否则在执行时会报错
	char *b="I love my wife!";
	printf("the string a is:%s\n",a);
	printf("the string b is:%s\n",b);
	printf("then copy b to a :\n");
	copy(a,b);
	printf("the string a is:%s\n",a);
	printf("the string b is:%s\n",b);	
}
void copy(char *x,char *y)
{
	int i=0;
	for(;*y!='\0';*x++,*y++)
	{
		*x=*y;
	}
	*x='\0';
}

输入a,b两个数,第一次调用函数process时求出两者的最大值,第二次调用时求出最小值,第三次调用时求和。

#include<stdio.h>
void main()
{
	int max(int,int);
	int min(int,int);
	int add(int,int);
	void process(int,int,int(*p)());
	int a,b;
	printf("please input the number:\n");
	scanf("%d%d",&a,&b);
	printf("the max is ");
	process(a,b,max);
	printf("the min is ");
	process(a,b,min);
	printf("the add is ");
	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 u;
	if(x<y)
	{
		u=x;
	}
	else
	{
		u=y;
	}
	return(u);
}
int add(int x,int y)
{
	int w;
	w=x+y;
	return(w);
}
void process(int x,int y,int(*p)())
{
	int i;
	if(p==max)
	{
		i=max(x,y);
	}
	else if(p==min)
	{
		i=min(x,y);
	}
	else
	{
		i=add(x,y);
	}
	printf("%d\n",i);
}

一组学生的成绩,每个学生有四门课,找出不及格的科目,并统计学生的学号。

#include<stdio.h>
void main()
{
	int a[3][4]={{99,87,65,78},{45,78,89,78},{87,69,45,35}};
	void found(double (*pointer)[4]);
	found(a);
}
void found(double (*pointer)[4])
{
	int i,j,k=0;
	int *p;
	for (i=0;i<3;i++)
	{
		p=*(pointer+i);
		for(j=0;j<4;j++)
		{
			if(*(p+j)<60)
			{
				printf("%d   ",*(p+j));
				k++;
			}
		}
		if(k!=0)
		{
			printf("学号%d 不及格的有%d门\n",i,k);
		}
		k=0;
	}
}

将一串字符串按首字母排序。

#include<stdio.h>
#include<string.h>
void main()
{
	void sort(char *a[],int n);
	void print(char *b[],int m);
	char *name[4]={"I love you","I love china","Can you marry me","Yes"};
	int n=4;
	sort(name,n);
	print(name,n);
}
void sort(char *a[],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(a[k],a[j])>0)
			{
				k=j;
			}
			if(k!=i)
			{
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
}
void print(char *b[],int m)
{
	int s;
	for(s=0;s<m;s++)
	{
		printf("%s  ",b[s]);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值