第八章 指针

目录

前言

一、输入a,b两个整数,用指针实现按先后的顺序排列

二、从键盘输入n个学生的成绩,求他们的平均成绩

三、用指针输出数组元素的值

1.列地址法

2.偏移量法

3.行指针法

四、用字符数组存放一个字符串,求字符串的长度,并输出其长度及该字符串

1.数组

2.字符指针

五、用指针输出二维数组

六、有多个字符串,求其中最大的字符串

七、用二级指针输出英文的星期

 


 


前言

所有的程序均已经过调试


一、输入a,b两个整数,用指针实现按先后的顺序排列

#include<stdio.h>
int main()
{
	int a,b,*p1,*p2,*p;
	p1=&a;p2=&b;
	printf("please input a b:");
	scanf("%d%d",p1,p2);
	if(*p1<*p2)
	{p=p1;
	p1=p2;
	p2=p;}
	printf("a=%d,b=%d\n",a,b);
	printf("*p1=%d *p2=%d",*p1,*p2);
	return 0;
}

注意:没有改变a,b的值,改变了指针的指向

#include<stdio.h>
int main()
{
	int a,b,*p1,*p2,t;
	p1=&a;p2=&b;
	printf("please input a b:");
	scanf("%d%d",p1,p2);
	if(*p1<*p2)
	{
		t=*p1;
		*p1=*p2;
		*p2=t;}
	printf("%d,%d\n",a,b);
	printf("%d,%d",*p1,*p2);
	return 0;}

注意:这里改变了a,b 的取值,而指针的指向没有改变

二、从键盘输入n个学生的成绩,求他们的平均成绩

#include<stdio.h>
#define N 5
int main()
{
	int a[N],i,sum=0;
for(i=0;i<N;i++)
scanf("%d",a+i);
for(i=0;i<N;i++)
sum=sum+*(a+i);
printf("%d",sum/N);
return 0;
}

三、用指针输出数组元素的值

1.列地址法

#include<stdio.h>
int main()
{
	int a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24},*p;
	for(p=a[0];p<a[0]+12;p++)
	{if((p-a[0])%4==0)
	printf("\n");
	printf("%-5d ",*p);
	}
	return 0;}

2.偏移量法

#include<stdio.h>
int main()
{
	int a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24},*p=a[0];
	int i,j;
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
		{
			printf("%-5d ",*(p+i*4+j));}
	printf("\n");	
	return 0;}

注意:使用的还是列指针。输出用的是偏移量法。

3.行指针法

#include<stdio.h>
int main()
{
	int a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24};
	int (*p)[4];
	int j;
	p=a;
	for(;p<a+3;p++)
	{	for(j=0;j<4;j++)
			printf("%-5d ",*(*p+j));}
	printf("\n");	
	return 0;}

注意:定义p时,圆括号不可省,因为【】的优先级高于*

四、用字符数组存放一个字符串,求字符串的长度,并输出其长度及该字符串。

1.数组:

#include<stdio.h>
int main()
{
	char str[]={"gong zhu dian xai."};
	int i,len;
	len=i=0;
	while(str[i++]!='\0')
		len++;
	printf("len=%d\n",len);
	printf("%s\n",str);
	return 0;

}

2.字符指针:

#include<stdio.h>
int main()
{
	char str[]={"gong zhu dian xai."},*p;
	int len;
	len=0;
                 p=str;
	while(*p!='\0')
	{	len++;p++;}
	printf("len=%d\n",len);
        p=str;
	printf("%s\n",p);
	return 0;
}

注意: p=str;
    printf("%s\n",p);
可以改为printf("%s\n",p-len);
可以先定义指针,再赋值。
char *p;
p="gong zhu dian xia .";

数组名是常量,其值直可引用,不可改变,不能作为赋值对象出现。
字符串的存储:
char str[20],*p=str;
scanf("%s",p);此时p有了明确的地址,可以进行存储。

五、用指针输出二维数组:

#include<stdio.h>
int main()
{
	int arr[3][3]={9,8,7,6,5,4,3,2,1},i,j;
	int *p[3]={arr[0],arr[1],arr[2]};
	for(i=0;i<3;i++)
	{printf("\n");
	for(j=0;j<3;j++)
		printf("%3d\n",p[i][j]);
	}
	return 0;
}

注意:指针数组p是数组名,不能进行自增自减运算。

六、有多个字符串,求其中最大的字符串

#include<stdio.h>
#include<string.h>
int main()
{
	char *str[]={"mei","li","xiao","hai"};
	int m=4;
	int i,max=0;
	for(i=1;i<m;i++)
		if(strcmp(str[i],str[max])>0)
			max=i;
		printf("max=%s\n",str[max]);
		return 0;}

七、用二级指针输出英文的星期

#include<stdio.h>
int main()
{
	char *week[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
	int w;
	char **ppw=week;
	for(;ppw<week+7;ppw++)
		printf("%10c %10s\n",**ppw,*ppw);
	return 0;
}

 


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值