前言
本文为业余学习《明解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]);
}
}
}
}