c语言中指针的使用

1.将两个整数实现由大到小的顺序依次输出:

#include <stdio.h>
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int *p=&m,*q=&n,*w;	
	if(m<n){
		w=p;
		p=q;
		q=w;
	}
	printf("%d %d",*p,*q);
	
	return 0;
}

2.交换两个变量的值:

#include <stdio.h>
void swap(int *p,int *q){
	int r;
	r=*p;
	*p=*q;
	*q=r;
	printf("%d %d",*p,*q);
} 
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int *p=&m,*q=&n,*w;	
	swap(&m,&n);
	return 0;
}

需要注意的是,如果使用函数原型的话,括号内应该是int *而不是int!

#include <stdio.h>
void swap(int*,int*);
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int *p=&m,*q=&n,*w;	
	swap(&m,&n);
	return 0;
}
void swap(int *p,int *q){
	int r;
	r=*p;
	*p=*q;
	*q=r;
	printf("%d %d",*p,*q);
}

这是因为定义的指针变量p 的类型为int *,而不是int。这一点值得注意。

3.数组传值后遍历:

#include <stdio.h>
double mul(int,int,double*);
int main()
{
	int m,n,i,j;
	scanf("%d%d",&m,&n);
	double a[9][9];
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%lf",&a[i][j]);
		}
	}
	printf("%f",mul(m,n,&a[0][0]));
	return 0;
}
double mul(int m,int n,double *p){
	double b=1;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			b*=(*(p+i*n+j));
		}
	}
	return b;
}

注:
①指针作形参:
1)一维数组a[]
函数原型:
void sort(int *a,int m);
(假设已在主调函数中定义了int data[M])
调用:sort(&data[0],4)或sort (data,4)。
2)二维数组a[][]
函数原型:
void sort(int *a,int m,double *p);
(假设已在主调函数中定义了int data[M][N])
调用:sort(&data[0][0],3,4)或sort(data[0],3,4)或sort(*data,3,4).

②数组作形参:
1)void sort(int a[],int m);
假定已在主调函数中定义了int data[M],则
调用:sort(data,4)或sort(&data[0],4)

2)void sort(int a[][N],int m,float n);
假定已在主调函数中定义int data[M][N],则
调用:sort(data,3,4)或sort(&data[0],3,4)

4.使用指针对二维整型数组递增排序:

5.指针数组:
例:int *p[5]定义了一个int型的指针数组,p包含5个元素,其中每个元素都是int型指针。

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

输出1 2 3 4 5.

6.把若干给定的字符串按字母顺序排序并输出:
主要是体会本题样例代码的思路以及关于字符串数组的输入与输出

#include <stdio.h>
#include <string.h>
char *name[]={"basic","programming","great wall","language","computer"};
	void sort_string(char *arr_str[],int n);
	void out_string(char *arr_str[],int n);
int main()
{
	sort_string(name,5);
	out_string(name,5);
	return 0;
}
void sort_string(char *arr_str[],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(arr_str[k],arr_str[j])>0)k=j;
			temp=arr_str[i];
			arr_str[i]=arr_str[k];
			arr_str[k]=temp;
		}
	}
}
void out_string(char *arr_str[],int n){
	int j;
	for(j=0;j<n;j++){
		printf("%s\n",arr_str[j]);
	}
}

7.编程序把给定字符串复制给另一个字符串(即实现strcpy函数的功能)

法一:

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[10],str2[10];
	gets(str1);
	char *p=str1,*q=str2;
	for(;*p!=0;p++){
		*(q++)=*p;
	}
	printf("%s",str2);
	return 0;
}

法二:

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[10],str2[10];
	gets(str1);
	char *p=str1,*q=str2;
	int i;
	for(i=0;*p!=0;p++,i++){
		q[i]=*p;//q使用数组形式,p使用指针形式 
	}
	q[i]='\0';//很重要,'0'是字符串末尾的结束标志 
	printf("%s",str2);
	return 0;
}

8.编函数,从n个整数中找出最大和最小的数:

#include <stdio.h>
void max_min_value(int x[],int n,int *max,int *min);
int main()
{
	int x[999],max,min;
	int n;
	scanf("%d",&n);
	int *p=&max;
	int *q=&min;
	for(int i=0;i<n;i++)scanf("%d",&x[i]);
	max_min_value(x,n,p,q);
	return 0;
}
void max_min_value(int x[],int n,int *max,int *min){
	int *p;
	*max=*x;*min=*x;			//把x[0]送入max,min所指变量中 
	for(p=x+1;p<x+n;p++){		//p从x[1]到x[n-1]循环 
		if(*p>*max)*max=*p;		//求极大值 
		if(*p<*min)*min=*p;		//求极小值 
	}
	printf("%d %d",*max,*min);
}

:本题的代码第14行–第19行为一个常用技巧,务必掌握!

9.计算调和级数前n项和:
在这里插入图片描述

#include <stdio.h>
int a,b,n;
void add(int ii){
	a=a*ii+b;
	b=b*ii;
}
int gcd(int u,int v){
	int r;
	r=v;
	while(r!=0){
		r=u%v;
		u=v;
		v=r;
	}
	return u;
}
void reduce(int *x,int *y){
	int g;
	g=gcd(*x,*y);
	*x=(*x)/g;
	*y=(*y)/g;
}
int main()
{
	int i;
	scanf("%d",&n);
	a=0;b=1;
	for(i=1;i<=n;i++){
		add(i);
		reduce(&a,&b);
	}
	printf("   %d\n",a);
	printf("Hn=--\n");
	printf("   %d\n",b);
	return 0;
}

这道题难度较大,主要考察了①模块化:将问题拆分成一个个小片段来实现,以及函数的嵌套调用;②分析问题的能力:从求和中看出一步步的递推关系和通分后分子分母的表达式循环实现。

10.【难】 第二次实验考 程序填空题:

参考程序1:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//对字符串排序、求最长字符串、计算最长字符串长度
char* StrSortMaxLenMax( char *p,char *str[ ],int *len,int n )
{
    char *a;
 	*len=0;
 	int i,j,r=0,b[10];
 	for(i=0,j=0;j<n;i+=51,j++)
 	{
 		str[j]=&p[i];
	}
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		if(strcmp(str[i],str[j])>0)
		{
			a=str[i];
			str[i]=str[j];
			str[j]=a;
		}
	}
	for(i=1;i<n;i++)
	{
		if(strlen(str[i])>strlen(str[r]))
		r=i;
	}
	*len=strlen(str[r]);
	return str[r]; 
}
int main()
{
    char SArr[10][51];//原始字符串
    char *PStrArr[10];//排序后各字符串指针
    char *StrLenMax;//最长字符串
    int MaxLen;//最长字符串长度
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {
        gets(SArr[i]);
    }
StrLenMax=StrSortMaxLenMax( &SArr[0][0], PStrArr ,&MaxLen ,n );
    for(int j=0;j<n;j++)
    {
        printf("%s\n",SArr[j]);//打印原始字符串
    }
    for(int k=0;k<n;k++)
    {
        printf("%s\n",PStrArr[k]);//打印排序后的字符串
    }
    printf("%s\n%d",StrLenMax,MaxLen);//打印最长字符串和最长字符串长度
    return 0;
}

参考程序2:(二维数组、指针数组、指针作参数)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//对字符串排序、求最长字符串、计算最长字符串长度
char* StrSortMaxLenMax( char p[][51],char *str[ ],int *len,int n )
{
   char *a;
 	*len=0;
 	int i,j,r=0,b[10];
 	for(i=0;i<n;i++)
 	{
 		str[i]=p[i];
	}
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		if(strcmp(str[i],str[j])>0)
		{
			a=str[i];
			str[i]=str[j];
			str[j]=a;
		}
	}
	for(i=1;i<n;i++)
	{
		if(strlen(str[i])>strlen(str[r]))
		r=i;
	}
	*len=strlen(str[r]);
	return str[r]; 
}
int main()
{
    char SArr[10][51];//原始字符串
    char *PStrArr[10];//排序后各字符串指针
    char *StrLenMax;//最长字符串
    int MaxLen;//最长字符串长度
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {
        gets(SArr[i]);
    }
    StrLenMax=StrSortMaxLenMax( SArr, PStrArr ,&MaxLen ,n );
    for(int j=0;j<n;j++)
    {
        printf("%s\n",SArr[j]);//打印原始字符串
    }
    for(int k=0;k<n;k++)
    {
        printf("%s\n",PStrArr[k]);//打印排序后的字符串
    }
    printf("%s\n%d",StrLenMax,MaxLen);//打印最长字符串和最长字符串长度
    return 0;
}

参考程序3:行指针

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//对字符串排序、求最长字符串、计算最长字符串长度
char* StrSortMaxLenMax( char (*p)[51],char *str[ ],int *len,int n )
{
   char *a;
 	*len=0;;
 	int i,j,r=0,b[10];
 	for(i=0;i<n;i++)  
 	{
 		str[i]=*(p+i);//或者str[i]=p[i];
	}
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		if(strcmp(str[i],str[j])>0)
		{
			a=str[i];
			str[i]=str[j];
			str[j]=a;
		}
	}
	for(i=1;i<n;i++)
	{
		if(strlen(str[i])>strlen(str[r]))
		r=i;
	}
	*len=strlen(str[r]);
	return str[r]; 
}
int main()
{
    char SArr[10][51];//原始字符串
    char *PStrArr[10];//排序后各字符串指针
    char *StrLenMax;//最长字符串
    int MaxLen;//最长字符串长度
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {
        gets(SArr[i]);
    }
    StrLenMax=StrSortMaxLenMax( SArr, PStrArr ,&MaxLen ,n );
    for(int j=0;j<n;j++)
    {
        printf("%s\n",SArr[j]);//打印原始字符串
    }
    for(int k=0;k<n;k++)
    {
        printf("%s\n",PStrArr[k]);//打印排序后的字符串
    }
    printf("%s\n%d",StrLenMax,MaxLen);//打印最长字符串和最长字符串长度
    return 0;
}

11.题目名称:数组反序

题目描述:编写程序,用递归方法反序数组。

输入:第一行输入一个正整数n(0<n≤100),表示数组的元素个数;第二行依次输入n个整数,作为数组的元素。

输出:顺次输出逆序后数组中元素,元素间以一个西文空格间隔,最后一个元素后无字符。

样例1:

输入:
8
0 2 3 4 5 9 10 8
输出:
8 10 9 5 4 3 2 0
样例2:

输入:
5
0 2 3 3 5
输出:
5 3 3 2 0

我的代码:(非递归算法)

#include <stdio.h>
void sort(int *p,int a[],int n);
int main()
{
	int n,a[999];
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	sort(&a[0],a,n);
	for(int j=0;j<n;j++){
		printf("%d",a[j]);
		if(j!=n-1)printf(" ");
	}
	return 0;
}
void sort(int *p,int a[],int n){
	int cmp;
	for(int i=0;i<=(n-1)/2;i++){
		cmp=p[i];
		p[i]=p[n-1-i];
		p[n-1-i]=cmp;
	}
}

函数部分值得反复揣摩!(深刻理解指针与数组的关系)

递归算法

#include <stdio.h>
void sort(int a[],int n);
int main()
{
	int n,a[999];
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	sort(a,n);
	for(int j=0;j<n;j++){
		printf("%d",a[j]);
		if(j!=n-1)printf(" ");
	}
	return 0;
}
void sort(int a[],int n){
	int cmp;
	if(n<=1)return ;
	else {
		cmp=*a;
		*a=*(a+n-1);
		*(a+n-1)=cmp;
		sort(a+1,n-2);
	}
}

同样是思考函数的设计及调用!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值