考研代码练习复习大全002-指针

053.通过指针变量访问整型变量

#include<stdio.h>
int main()
{
	int a=100,b=10;//定义整型变量,并初始化 
	int *pointer_1, *pointer_2;//定义指向整形数据的指针变量pointer_1,pointer_2
	pointer_1 = &a;//把变量a的地址赋给指针变量pointer_1 
	pointer_2 = &b;//把变量b的地址赋给指针变量pointer_2 
	
	printf("a=%d,b=%d\n",a,b);//输出a,b的值
	printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2); //输出a,b的值
	
	return 0;
} 
/*note1:第四行的*pointer_1,*pointer_2分别代表定义两个指针变量pointer_1,pointer_2
而最后的输出语句中的*pointer_1,*pointer_2分别代表指针变量pointer_1,pointer_2所指向的变量,也就是变量a和b
note2:指针变量的类型用来指定指定此指针变量可以指向的变量的类型
*/

054.输入两个整数,按先大后小的顺序输出a和b.

#include<stdio.h>

int main()
{
	int *p1,*p2,*p,a,b;
	printf("please enter two integer numbers:");
	scanf("%d,%d",&a,&b);
	p1 = &a;
	p2 = &b;
	
	if(a<b)
	{
		p1=&b;
		p2=&a;
	}
//下面注释代码作用同上	
//	if(a<b){
//		p = p1;
//		p1 = p2;
//		p2 = p;
//	}
	printf("max = %d,min = %d",*p1,*p2);
	
	return 0;
}  

055.同54题,但是本题要求通过定义一个函数来实现值的交换。

#include<stdio.h>

int main()
{
	void swap(int *p1,int *p2);
	int *pointer_1,*pointer_2,a,b;
	printf("please enter two integer numbers:");
	scanf("%d,%d",&a,&b);
	pointer_1 = &a;
	pointer_2 = &b;
	
	if(a<b)
	{
		swap(pointer_1,pointer_2);
	}

	printf("max = %d,min = %d",a,b);
	
	return 0;
} 
//原理和54题不同
void swap(int *p1,int *p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
} 

056.输入3个整数。实现从大到小输出。

#include<stdio.h>

int main()
{
	void swap(int *p1,int *p2,int *p3);

	int *pointer_1,*pointer_2,*pointer_3,a,b,c;
	printf("please enter two integer numbers:");
	scanf("%d,%d,%d",&a,&b,&c);
	pointer_1 = &a;
	pointer_2 = &b;
	pointer_3 = &c;
	
	swap(pointer_1,pointer_2,pointer_3);

	printf("max = %d,mid = %d,min = %d",a,b,c);
	
	return 0;
} 

void swap(int *p1,int *p2,int *p3)
{
	void swap_2(int *p1,int *p2);
	if(*p1<*p2)
	{
		swap_2(p1,p2);
	}
	if(*p1<*p3)
	{
		swap_2(p1,p3);
	}
	if(*p2<*p3)
	{
		swap_2(p2,p3);
	}
}

void swap_2(int *p1,int *p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}  

057.有一个整型数组a,有10个元素,要求输出数组中的全部元素
分析:三种方法
1.下标法:

#include<stdio.h>

int main()
{
	int i,a[10];
	
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	
	for(i=0;i<10;i++)
	{
		printf("%3d",a[i]);
	}
	
	return 0;
} 

2.通过数组名找出元素地址,找出元素的值。

#include<stdio.h>

int main()
{
	int i,a[10];
	
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
		//或者可以写成:scanf("%d",a+i);
	}
	
	for(i=0;i<10;i++)
	{
		printf("%3d",*(a+i));
	}
	
	return 0;
} 

3.用指针变量指向数组元素。

#include<stdio.h>

int main()
{
	int i,a[10];
	int *p;
	
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	/*循环获取值还可以用下面代码
	for(p=a;p<(a+10);p++)
	{
		scanf("%d",p);
	}
	*/
	
	for(p=a;p<a+10;p++)
	{
		printf("%3d",*p);
	}
	
	return 0;
} 

058.通过指针变量输出整型数组a的10个元素。

#include<stdio.h>

int main()
{
	int i,a[10];
	int *p=a;
	
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",p++);
	}
	//这里要重新使p指向a[0],因为经过上面的循环p已经指向数组的末尾 
	p=a;
	for(i=0;i<10;i++,p++)
	{
		printf("%3d",*p);
	}
	//上面的循环还可以写成下面的
	/*
	for(i=0;i<10;i++)
	{
		printf("%3d",p[i]);
	}
	*/
	
	return 0;
} 

059.将数组a中n个整数按相反顺序存放。

#include<stdio.h>

int main()
{
	void inv(int x[],int n);
	int a[]={3,6,9,12,15,18,21,24};
	int i;
	printf("the original array:\n");
	for(i=0;i<8;i++)
	{
		printf("%3d",a[i]);
	}
	printf("\n");
	inv(a,8);
	
	printf("the array has been inverted:\n");
	for(i=0;i<8;i++)
	{
		printf("%3d",a[i]);
	}
	
	return 0;
} 

void inv(int x[],int n)
{
	int temp,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;
	}
}

060.(同59题)形参用指针变量

#include<stdio.h>

int main()
{
	void inv(int *x,int n);
	int a[]={3,6,9,12,15,18,21,24};
	int i;
	printf("the original array:\n");
	for(i=0;i<8;i++)
	{
		printf("%3d",a[i]);
	}
	printf("\n%d,%d",&a[0],&a[7]);//观察地址
	printf("\n");
	inv(a,8);
	
	printf("the array has been inverted:\n");
	for(i=0;i<8;i++)
	{
		printf("%3d",a[i]);
	}
	
	printf("\n%d,%d",&a[0],&a[7]);//观察地址
	
	return 0;
} 

void inv(int *x,int n)
{
	int *p,temp,*i,*j,m=n/2;
	i=x;
	j=x+n-1;
	p=x+m;
	for(;i<p;i++,j--)
	{
		temp = *i;
		*i = *j;
		*j = temp;
	}
}

061.(同60题)用指针变量做实参

#include<stdio.h>

int main()
{
	void inv(int *x,int n);
	int a[]={3,6,9,12,15,18,21,24};
	int i,*p=a;
	printf("the original array:\n");
	for(i=0;i<8;i++)
	{
		printf("%3d",*(p+i));
	}
	printf("\n%d,%d",&a[0],&a[7]);
	printf("\n");
	inv(p,8);
	
	printf("the array has been inverted:\n");
	for(p=a;p<a+8;p++)
	{
		printf("%3d",*p);
	}
	
	printf("\n%d,%d",&a[0],&a[7]);
	
	return 0;
} 

void inv(int *x,int n)
{
	int *p,temp,*i,*j,m=n/2;
	i=x;
	j=x+n-1;
	p=x+m;
	for(;i<p;i++,j--)
	{
		temp = *i;
		*i = *j;
		*j = temp;
	}
}

062.用指针的方法对10个整数按照由大到小顺序排序。

#include<stdio.h>

int main()
{
	void sort(int *p,int n);
	
	int a[10];
	int i,*p;
	
	p = a;
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++)
	{
		scanf("%d",p+i);
	}
	printf("\n");

	sort(p,10);
	
	for(i=0;i<10;i++)
	{
		printf("%3d",*(p+i));
	}
	
	
	
	return 0;
} 

void sort(int *p,int n)
{
	int i,j,temp;
	
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(*(p+i)<*(p+j))
			{
				temp = *(p+i);
				*(p+i) = *(p+j);
				*(p+j) = temp;
			}
		}
	}
	
}

Note:更优解⬇:⭐⭐⭐⭐⭐
分析:相对于上面的排序优点:交换次数变少(假如n个数。上面交换次数最多为:(n-1)n/2,下面最多为:n-1 )

void sort(int *x,int n)
{
	int i,j,k,t;
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(*(x+j)>*(x+k))
			{
				k=j;
			}
		}
		if(i!=k)
		{
			t = *(x+i);
			*(x+i) = *(x+k);
			*(x+k) = t;
		}
	}
} 

063.输出二维数组的有关数据(地址和元素的值)

#include<stdio.h>

int main()
{
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	
	printf("%d,%d\n",a,*a);//0行起始地址,0行0列元素地址 
	printf("%d,%d\n",a[0],*(a+0));// 0行0列元素地址 
	printf("%d,%d\n",&a[0],&a[0][0]);// 0行首元素地址,0行0列元素地址 
	printf("%d,%d\n",a[1],a+1);//1行0列元素地址,1行首地址 
	printf("%d,%d\n",&a[1][0],*(a+1)+0);//1行0列元素地址 
	printf("%d,%d\n",a[2],*(a+2));//2行0列元素地址, 
	printf("%d,%d\n",&a[2],a+2);//2行起始地址 
	printf("%d,%d\n",a[1][0],*(*(a+1)+0));// 1行0列元素的值
	printf("%d,%d\n",*a[2],*(*(a+2)+0));// 2行0列元素的值 
	
	
	
	return 0;
} 

064.有一个3*4的二维数组,要求用指向元素的指针变量输出二维数组各个元素的值。

#include<stdio.h>

int main()
{
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int *p,i,j;
	p = a;
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%3d",*(*(a+i)+j));
		}
		printf("\n");
	} 
		
	return 0;
} 

方法二:

#include<stdio.h>

int main()
{
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int *p,i,j;
	
	for(p=a[0];p<a[0]+12;p++)
	{
		if((p-a[0]) % 4 == 0)
		{
			printf("\n");
		}
		printf("%3d",*p);
	}
	
		
	return 0;
}

065.一维数组和二维数组的比较

#include<stdio.h>

int main()
{
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int *p=a[0],(*p1)[4];
	p=p+4;
	p1=a;
	
	printf("%d,%d,%d,%d,%d\n",a[0],p,p-a[0],*p,p1+1);//6422196,6422212,4,5,6422212
	
	
	int a2[] = {1,2,3,4,5,6,7,8};
	int *p2=&a2[0];
	p2=p2+4;
	printf("%d,%d,%d,%d",&a2[0],p2,p2-&a2[0],*p2);//6422164,6422180,4,5

	
		
	return 0;
} 

066.输出二维数组任一行任一列元素的值。(指向一维数组的指针变量解题,或者使用指向数组元素的指针变量(i*4+j来定位))

#include<stdio.h>

int main()
{
	int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int (*p)[4],i,j;
	
	p=a;
	printf("please enter row and column:");
	scanf("%d,%d",&i,&j);
	printf("%d",*(*(p+i)+j));	
	
	return 0;
} 

067.有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。

#include<stdio.h>

int main()
{
	void average(float *p,int n);
	void search(float (*p)[4],int i);
	float score[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int n;
	printf("please enter number of student:");
	scanf("%d",&n);
	average(*score,12);
	search(score,n);
	
	return 0;
} 
void average(float *p,int n)
{
	float *p_end = p+n-1;
	float sum=0,aver;
	
	for(;p<p_end;p++)
	{
		sum += *p;
	}
	aver = sum/n;
	printf("class average is %3.1f",aver);
}
//i的取值为1,2,3
void search(float (*p)[4],int i)
{
	int j;
	for(j=0;j<4;j++)
	{
		printf("%6.1f",*(*(p+i-1)+j));
	}
}

068.在上题问题的基础上。查找一门以上课程不及格的学生。输出他们全部课程的成绩。

#include<stdio.h>

int main()
{
	void search(float (*p)[4],int n);
	float score[][4] = {1,2,3,4,5,6,7,8,69,60,61,62};

	search(score,3);
	
	return 0;
} 

void search(float (*p)[4],int n)
{
	int j,i,flag;
	for(j=0;j<3;j++)
	{
		flag =0;
		for(i=0;i<4;i++)
		{
			if(*(*(p+j)+i)<60)
			{
				flag =1;
			}
		}
		if(flag == 1)
		{
			printf("No%d,scores is:",j+1);
			for(i=0;i<4;i++)
			{
				printf("%5.1f",*(*(p+j)+i));
			}
			printf("\n");
		}
	}
}

069.定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第八个字符。

#include<stdio.h>

int main()
{
	char string[] = "I love China!";
	printf("%s\n",string);
	printf("%c\n",string[7]);
	
	return 0;
} 

070.同69题,但是用指针。

#include<stdio.h>

int main()
{
	char *string = "I love China!";
	
	printf("%s\n",string);
	printf("%c",*(string+7));
	
	return 0;
} 

071.将字符串a复制为字符串b,然后输出字符串b

#include<stdio.h>

int main()
{
	char a[] = "I love China!",b[20];
	int i;
	
	for(i=0;a[i]!='\0';i++)
	{
		//或者:*(b+i) = *(a+i);
		b[i] = a[i];	 
	}
	//或者:*(b+i) = '\0'; 
	b[i] = '\0';
	printf("%s\n",b);
	
	return 0;
}  

072.同71,这里用指针变量处理

#include<stdio.h>

int main()
{
	char a[] = "I love China!",b[20],*p1,*p2;
	p1=a,p2=b;
	
	for(;*p1 != '\0';p1++,p2++)
	{
		*p2 = *p1;
	}
	*p2 = '\0';
	
	printf("%s\n",a);
	printf("%s\n",b); 
	
	return 0;
}  

073.用函数调用实现字符串的复制
方法一:

#include<stdio.h>

int main()
{
	void copy_string(char from[],char to[]);
	char a[] = "I love China!",b[20];

	
	copy_string(a,b);
	
	printf("%s\n",a);
	printf("%s\n",b); 
	
	return 0;
}
//第一种:用字符数组名做函数参数 
void copy_string(char from[],char to[])
{
	int i;
	for(i=0;from[i]!='\0';i++)
	{
		to[i] = from[i];
	}
	to[i] = '\0';
}

0731.方法二:

#include<stdio.h>

int main()
{
	void copy_string(char from[],char to[]);
	char a[] = "I love China!",b[20],*p,*q;
	p=a;
	q=b;
	
	copy_string(p,q);
	
	printf("%s\n",a);
	printf("%s\n",b); 
	
	return 0;
}
//第二种:用字符指针变量做形参和实参 
void copy_string(char from[],char to[])
{
	char *p1,*p2;
	p1 = from;
	p2 = to;
	
	for(;*p1 != '\0'; p1++,p2++)
	{
		*p2 = *p1;
	}
	*p2 = '\0';
}
//第三种: 数组做形参,指针变量做实参-------即第一种的主函数和第二种自定义函数的结合体 

074.73题的改进

void copy_string(char *from,char *to)
	{
		while((*to = *from)!='\0')
		{
			to++;
			from++;
		}
	}
void copy_string(char *from,char *to)
	{
		while((*to++ = *from++)!='\0');
	}
void copy_string(char *from,char *to)
	{
		while(*from!='\0')
		{
			*to++ = *from++;
		}
		*to = '\0';
	}
void copy_string(char *from,char *to)
	{
		while(*to++ = *from++);
	}

075.改变指针变量的值

#include<stdio.h>

int main()
{
	char *a = "I Love China!";
	a = a+7;
	
	printf("%s\n",a);
	
	return 0;
}

076.用函数求整数a,b中的最大者。(通过函数名调用)

#include<stdio.h>

int main()
{
	int max(int x, int y);
	int a,b,c;
	printf("please enter a and b:");
	scanf("%d,%d",&a,&b);
	
	c = max(a,b);
	printf("a=%d,b=%d,max=%d",a,b,c);
	
	return 0;
}

int max(int x, int y)
{
	return (x>y? x:y);
} 

077.用函数求整数a,b中的最大者。(通过指针变量调用它所指向的函数)

#include<stdio.h>

int main()
{
	int max(int x, int y);
	int a,b,c;
	int (*p)(int,int);
	p = max;
	printf("please enter a and b:");
	scanf("%d,%d",&a,&b);
	
	c = (*p)(a,b);
	printf("a=%d,b=%d,max=%d",a,b,c);
	
	return 0;
}

int max(int x, int y)
{
	return (x>y? x:y);
} 

078.输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数,选2时调用min函数,输出二者中的小数。

#include<stdio.h>

int main()
{
	int max(int x, int y);
	int min(int x, int y);
	int a,b,c,n;
	int (*p)(int,int);

	printf("please enter a and b:");
	scanf("%d,%d",&a,&b);
	
	printf("please choose 1 or 2:");
	scanf("%d",&n);
	
	if(n==1)
	{
		p=max;
		c = (*p)(a,b);
		printf("a=%d,b=%d,max=%d",a,b,c);
	}
	else if(n==2)
	{
		p=min;
		c = (*p)(a,b);
		printf("a=%d,b=%d,min=%d",a,b,c);
	}	
	return 0;
}

int max(int x, int y)
{
	return (x>y? x:y);
} 

int min(int x, int y)
{
	return (x<y? x:y);
} 

079.有两个整数a和b,由用户输入1,2或3.输入1,程序给出a和b中的大者,输入2,就给出a和b中的小者。输入3,则求a与b之和。

#include<stdio.h>

int main()
{
	int fun(int x, int y, int (*p)(int,int));
	int max(int x, int y);
	int min(int x, int y);
	int add(int x, int y);
	int a,b,c,n;

	printf("please enter a and b:");
	scanf("%d,%d",&a,&b);
	
	printf("please choose 1 or 2 or 3:");
	scanf("%d",&n);
	
	if(n==1)
	{
		fun(a,b,max);
	}
	else if(n==2)
	{
		fun(a,b,min);
	}	
	else
	{
		fun(a,b,add);
	}
	return 0;
}

int fun(int x, int y, int (*p)(int,int))
{
	(*p)(x,y);
	
}

int max(int x, int y)
{
	int z;
	z= x>y? x:y;
	printf("max=%d",z);
	return z;
} 

int min(int x, int y)
{
	int z;
	z= x<y? x:y;
	printf("min=%d",z);
	return z;
} 

int add(int x, int y)
{
	int z;
	z= x+y;
	printf("sum=%d",z);
	return z;
} 

080.有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。

#include<stdio.h>

int main()
{
	float *search(float (*pointer)[4],int n);
	float score[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	float *p;
	int n,i;
	printf("please enter number of student:");
	scanf("%d",&n);
	p = search(score,n);
	for(i=0;i<4;i++)
	{
		printf("%5.1f",*(p+i));
	}
	
	return 0;
}

float *search(float (*pointer)[4],int n)
{
	float *pt;
	pt = *(pointer+n);
	return pt;
}

081.对上一题找出其中不及格的课程的学生及其学生号。

#include<stdio.h>

int main()
{
	float *search(float (*pointer)[4]);
	float score[][4] = {{1,2,3,4},{5,6,7,80},{90,100,110,120}};
	float *p;
	int i,j;

	for(i=0;i<3;i++)
	{
		p = search(score+i);
		if(p !=NULL)
		{
			printf("No.%d score:",i);
			for(j=0;j<4;j++)
			{
				printf("%5.1f",*(p+j));
			}
			printf("\n");
			
		}
	}
	
	return 0;
}

float *search(float (*pointer)[4])
{
	int i;
	float *pt;
	pt = NULL;
	for(i=0;i<4;i++)
	{
		if(*(*pointer+i) < 60)
		{
			pt = *pointer;
		}
	}
	return pt;
}

082.将若干字符串按照字母顺序(由小到大)输出。

#include<stdio.h>
#include<string.h>

int main()
{
	void sort(char *name[],int n);
	void print(char *name[],int n);
	
	char *name[] = {"basic","python","c","go","javascript"};
	sort(name,5);
	print(name,5);
	return 0;
} 

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[j], name[k])<0)
			{
				k=j;
			}
		}
		if(k!=i)
		{
			temp = name[i];
			name[i] = name[k];
			name[k] = temp;
		}
	} 
}
void print(char *name[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%15s",name[i]);
	}
}

输出函数改进

void print2(char *name[],int n)
{
	int i = 0;
	char *p;
	p = name[0];
	while(i<n)
	{
		p=*(name+i++);
		printf("%s\n",p);
	}
}

★★★★非零值都为逻辑真,零为逻辑假
83.指向指针数据的指针变量。

#include<stdio.h>
#include<string.h>

int main()
{
	char *name[] = {"basic","python","c","go","javascript"};
	char **p;
	int i;
	
	for(i=0;i<5;i++)
	{
		p = name + i;
		printf("%s\n",*p);
	}
	
	return 0;
} 

084.有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。

#include<stdio.h>
#include<string.h>

int main()
{
	int a[5] = {1,3,5,7,9};
	int * name[5] = {&a[0],&a[1],&a[2],&a[3],&a[4]};
	int **p, i;
	
	p = name;
	for(i=0;i<5;i++)
	{
		printf("%3d",**(p+i));
	}
	return 0;
} 

085.建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。

#include<stdio.h>
#include<stdlib.h>

int main()
{
	void check(int *p);
	int *p1,i;
	p1 = (int *)malloc(5*sizeof(int));//其实这里会自定转换,不人位转换也可以
	
	for(i=0;i<5;i++)
	{
		scanf("%d",p1+i);
	}
	
	check(p1);
	
	return 0;
} 
void check(int *p)
{
	int i;
	for(i=0;i<5;i++)
	{
		if(*(p+i)<60)
		{
			printf("%d\n",*(p+i));
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值