明解C语言入门篇_第10章_指针

前言

本文为业余学习《明解C语言入门篇》的记录,包含代码清单和练习题。
开始学习时间:2022年8月21日
+++++++++++++++++++++++++++++++
第1章 初识C语言
第2章 运算和数据类型
第3章 分支结构程序
第4章 程序的循环控制
第5章 数组
第6章 函数
第7章 基本数据类型
第8章 动手编写各种程序吧
第9章 字符串的基本知识
第10章 指针
第11章 字符串和指针
第12章 结构体
第13章 文件处理
+++++++++++++++++++++++++++++++

第10章、指针

10-1 指针

代码清单 10-1

//计算两个整数的和与差(误例)

#include <stdio.h>

void sum_diff(int n1,int n2,int sum,int diff);

int main()
{
	int na,nb;
	int wa=0,sa=0;

	puts("请输入两个整数。");
	printf("整数A:");	scanf("%d",&na);
	printf("整数B:");	scanf("%d",&nb);

	sum_diff(na,nb,wa,sa);

	printf("两数之和为%d,之差为%d。\n",wa,sa);

	return 0;
}

void sum_diff(int n1,int n2,int sum,int diff)
{
	sum=n1+n2;
	diff=(n1>n2)?n1-n2:n2-n1;
}

代码清单 10-2

//显示对象的地址

#include <stdio.h>

int main()
{
	int n;
	double x;
	int a[3];
	int i;
	
	printf("n的地址:%p\n",&n);
	printf("x的地址:%p\n",&x);
	for(i=0;i<3;i++)
	{
		printf("a[%d]的地址:%p\n",i,&a[i]);
	}

	return 0;
}

代码清单 10-3

//通过指针间接地操作身高

#include <stdio.h>

int main()
{
	int sato=178;
	int sanaka=175;
	int masaki=179;

	int *isako,*hiroko;

	isako=&sato;
	hiroko=&masaki;

	printf("伊沙子喜欢的人的身高:%d\n",*isako);
	printf("洋子喜欢的人的身高:%d\n",*hiroko);

	isako=&sanaka;
	*hiroko=180;

	printf("\n佐藤的身高:%d\n",sato);
	printf("佐中的身高:%d\n",sanaka);
	printf("真崎的身高:%d\n",masaki);
	printf("伊沙子喜欢的人的身高:%d\n",*isako);
	printf("洋子喜欢的人的身高:%d\n",*hiroko);

	return 0;
}

10-2 指针和函数

代码清单 10-4

//通过指针间接修改身高

#include <stdio.h>

void hiroko(int *height);

int main()
{
	int sato=178;
	int sanaka=175;
	int masaki=179;

	hiroko(&masaki);

	printf("佐藤的身高:%d\n",sato);
	printf("佐中的身高:%d\n",sanaka);
	printf("真崎的身高:%d\n",masaki);

	return 0;
}

void hiroko(int *height)
{
	if(*height<180)
	{
		*height=180;
	}
}

代码清单 10-5

//计算两个整数的和与差

#include <stdio.h>

void sum_diff(int n1,int n2,int *sum,int *diff);

int main()
{
	int na,nb;
	int wa=0,sa=0;

	puts("请输入两个整数。");
	printf("整数A:");	scanf("%d",&na);
	printf("整数B:");	scanf("%d",&nb);

	sum_diff(na,nb,&wa,&sa);

	printf("两数之和为%d,之差为%d。\n",wa,sa);

	return 0;
}

void sum_diff(int n1,int n2,int *sum,int *diff)
{
	*sum=n1+n2;
	*diff=n1>n2?n1-n2:n2-n1;
}

代码清单 10-6

//将两个整数值互换

#include <stdio.h>

void swap(int *n1,int *n2);

int main()
{
	int a,b;

	printf("a = ");	scanf("%d",&a);
	printf("b = ");	scanf("%d",&b);

	swap(&a,&b);
	
	puts("a和b的值互换后:");
	printf("a = %d\n",a);
	printf("b = %d\n",b);

	return 0;
}

void swap(int *n1,int *n2)
{
	int temp=*n1;
	*n1=*n2;
	*n2=temp;
}

练习 10-1

//编写函数adjust_point,n指向的值小于0则改为0,大于100则改为100,否则不变。

#include <stdio.h>

void adjust_point(int *n);

int main()
{
	int x;
	int retry;

	do
	{
		printf("x = ");
		scanf("%d",&x);

		adjust_point(&x);
		printf("x-->:%d\n",x);

		printf("是否继续?是[1]/否[0]:");
		scanf("%d",&retry);
	}while(retry==1);

	return 0;
}

void adjust_point(int *n)
{
	if(*n<0)
	{
		*n=0;
	}
	if(*n>100)
	{
		*n=100;
	}
}

练习 10-2

//编写函数,将日期改为前一天和后一天,须判断闰年日期。

#include <stdio.h>

void date_pre(int *y,int *m,int *d);
void date_after(int *y,int *m,int *d);
int days(int year,int month);
int IsLeap(int year);

int main()
{
	int year,month,date;

	printf("Year:");	scanf("%d",&year);
	printf("Month:");	scanf("%d",&month);
	printf("Date:");	scanf("%d",&date);

	printf("输入的日期:%d-%d-%d\n",year,month,date);
	date_pre(&year,&month,&date);
	printf("前一天日期:%d-%d-%d\n",year,month,date);
	date_after(&year,&month,&date);
	date_after(&year,&month,&date);
	printf("后一天日期:%d-%d-%d\n",year,month,date);

	return 0;
}

void date_pre(int *y,int *m,int *d)
{
	(*d)--;
	if(*d==0)
	{
		*d=days(*y,--*m);
	}
	if(*m==0)
	{
		(*y)--;
		*m=12;
	}
}

void date_after(int *y,int *m,int *d)
{
	(*d)++;
	if(*d>days(*y,*m))
	{
		*d=1;
		(*m)++;
	}
	if(*m>12)
	{
		(*y)++;
		*m=1;
	}
}

int days(int year,int month)
{
	int ds;

	switch(month)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12: ds=31; break;
		case 2: if(IsLeap(year)){ds=29;}else{ds=28;} break;
		default:ds=30; break;
	}

	return ds;
}

int IsLeap(int year)
{
	return year % 4 == 0 && year % 100 != 0||year % 400 == 0;
}

代码清单 10-7

//将两个整数值按升序排列

#include <stdio.h>

void swap(int *px,int *py);
void sort2(int *n1,int *n2);

int main()
{
	int na,nb;

	printf("请输入整数A:");	scanf("%d",&na);
	printf("请输入整数B:");	scanf("%d",&nb);

	sort2(&na,&nb);

	printf("整数A是%d。\n",na);
	printf("整数B是%d。\n",nb);

	return 0;
}

void swap(int *px,int *py)
{
	int temp;

	temp=*px;
	*px=*py;
	*py=temp;
}

void sort2(int *n1,int *n2)
{
	if(*n1>*n2)
	{
		swap(n1,n2);
	}
}

练习 10-3

//将n1、n2、n3指向的三个整数按升序排列

#include <stdio.h>

void sort3(int *n1,int *n2,int *n3);

int main()
{
	int a,b,c;

	printf("整数a:");	scanf("%d",&a);
	printf("整数b:");	scanf("%d",&b);
	printf("整数c:");	scanf("%d",&c);

	sort3(&a,&b,&c);

	printf("a = %d\nb = %d\nc = %d\n",a,b,c);

	return 0;
}

void sort3(int *n1,int *n2,int *n3)
{
	int temp;

	if(*n1>*n2)
	{
		temp=*n1;
		*n1=*n2;
		*n2=temp;
	}

	if(*n1>*n3)
	{
		temp=*n1;
		*n1=*n3;
		*n3=temp;
	}

	if(*n2>*n3)
	{
		temp=*n2;
		*n2=*n3;
		*n3=temp;
	}
}

代码清单 10-8

//将两个实数进行互换(误例)

#include <stdio.h>

void swap(int *px,int *py);

int main()
{
	double da,db;

	printf("实数A:");	scanf("%lf",&da);
	printf("实数B:");	scanf("%lf",&db);

	swap(&da,&db);

	printf("A = %f\n",da);
	printf("B = %f\n",db);

	return 0;
}

void swap(int *px,int *py)
{
	int temp;

	temp=*px;
	*px=*py;
	*py=temp;
}

10-3 指针和数组

代码清单 10-9

//显示数组元素的地址(指向元素的指针)

#include <stdio.h>

int main()
{
	int i;
	int a[5]={1,2,3,4,5};
	int *p=a;

	for(i=0;i<5;i++)
	{
		printf("&a[%d] = %p p+%d = %p\n",i,&a[i],i,p+i);
	}

	return 0;
}

代码清单 10-10

//显示数组元素的值和地址

#include <stdio.h>

int main()
{
	int i;
	int a[5]={1,2,3,4,5};
	int *p=a;

	for(i=0;i<5;i++)
	{
		printf("a[%d]=%d, *(a+%d)=%d, p[%d]=%d, *(p+%d)=%d\n",
				i,a[i],i,*(a+i),i,p[i],i,*(p+i));
	}
	for(i=0;i<5;i++)
	{
		printf("&a[%d]=%p, a+%d=%p, &p[%d]=%p, p+%d=%p\n",
				i,&a[i],i,a+i,i,&p[i],i,p+i);
	}

	return 0;
}

代码清单 10-11

//用ary_set(&a[2],2,99)调用代码清单10-11中的ary_set函数

#include <stdio.h>

void ary_set(int v[],int n,int val);

int main()
{
	int i;
	int a[]={1,2,3,4,5};

	ary_set(a,5,99);

	for(i=0;i<5;i++)
	{
		printf("a[%d] = %d\n",i,a[i]);
	}

	return 0;
}

void ary_set(int v[],int n,int val)
{
	int i;

	for(i=0;i<n;i++)
	{
		v[i]=val;
	}
}

练习 10-4

//编写函数,接收元素类型为int型、元素个数为n的数组,并为所有元素赋上和下标相同的值

#include <stdio.h>

void set_idx(int *v,int n);

int main()
{
	int arr[5];
	int i;

	set_idx(arr,5);

	for(i=0;i<5;i++)
	{
		printf("arr[%d] = %d\n",i,arr[i]);
	}

	return 0;
}

void set_idx(int *v,int n)
{
	int i;

	for(i=0;i<n;i++)
	{
		v[i]=i;
	}
}

练习 10-5

//用ary_set(&a[2],2,99)调用代码清单10-11中的ary_set函数

#include <stdio.h>

void ary_set(int v[],int n,int val);

int main()
{
	int i;
	int a[]={1,2,3,4,5};

	ary_set(&a[2],2,99);

	for(i=0;i<5;i++)
	{
		printf("a[%d] = %d\n",i,a[i]);
	}

	return 0;
}

void ary_set(int v[],int n,int val)
// v接收的地址是a+2,n=2,所以下面改变的是a[2]和a[3]的值,a[0]、a[1]和a[4]的值不变
{
	int i;

	for(i=0;i<n;i++)
	{
		v[i]=val;
	}
}

总结

summary

//学生成绩排序

#include <stdio.h>

#define NUMBER 5

void swap(int *px,int *py);
void bsort(int arr[],int n);

int main()
{
	int i;
	int score[NUMBER];

	printf("请输入%d名学生的成绩。\n",NUMBER);
	for(i=0;i<NUMBER;i++)
	{
		printf("%d号:",i+1);
		scanf("%d",&score[i]);
	}

	bsort(score,NUMBER);

	puts("分数升序排列。");
	for(i=0;i<NUMBER;i++)
	{
		printf("%d号:%d\n",i+1,score[i]);		
	}

	return 0;
}

void swap(int *px,int *py)
{
	int temp=*px;
	*px=*py;
	*py=temp;
}

void bsort(int arr[],int n)
{
	int i,j;

	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(arr[j-1]>arr[j])
			{
				swap(&arr[j-1],&arr[j]);
			}
		}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值