学完C语言的 数据类型,顺序,分支,循环结构,数组等内容,已经能够实现一些小程序的编写了,但如何简化程序,成为一个C语言进阶者?
必须理解和熟练指针的使用。
1.通过指针变量访问整型变量。
#include<stdio.h>
int main()
{
int a=100,b=10;
int *pointer_1,*pointer_2;
//2个指向整型数据指针
pointer_1=&a;
pointer_2=&b;
printf("a=%d,b=%d\n",a,b);
printf("*point_1=%d,*point_2=%d\n",*pointer_1,*pointer_2);
//输出a,b的地址
return 0;
}
2.输入a和b两个整数,按先大后小的顺序输出a和b。
#include<stdio.h>
int main()
{
// 输入a和b两个整数,按先大后小的顺序输出a和b。
int *p1,*p2,*p;
int a,b;
printf("请输入两个整数:\n");
scanf("%d%d",&a,&b);
p1=&a;//p1指向变量a
p2=&b;//p2指向变量b
if(a<b)
{//p1与p2指向的变量交换
p=p1;
p1=p2;
p2=p;
}
printf("a=%d,b=%d\n",a,b);//输出a,b
printf("max=%d,min=%d",*p1,*p2);//输出p1,p2指向的值
return 0;
}
3.输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。
#include<stdio.h>
int main()
{
void swap(int *x,int *y);//函数声明
int a,b;
int *p1,*p2;//定义两个整型指针变量
printf("请输入a和b:\n");
scanf("%d%d",&a,&b);
p1=&a;//p1指向变量a
p2=&b;//p2指向变量b
if(a<b)
swap(p1,p2);//进行函数调用,如果a<b,交换
//a=*p1,b=*p2
printf("max=%d\tmin=%d\n",a,b);
printf("max=%d\tmin=%d\n",*p1,*p2);
//p1=&a p2=&b
printf("%d\t%d\n",p1,p2);
printf("%d\t%d\n",&a,&b);
return 0;
}
void swap(int *x,int *y)//函数定义
{
int t; //交换地址
t=*x;
*x=*y;
*y=t;
}
4.输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。(与题3相同方法)
#include<stdio.h>
int main()
{
//输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。
int a,b,c;
int *p1,*p2,*p3;
printf("请输入3个整数:\n");
scanf("%d%d%d",&a,&b,&c);//输入3个数
p1=&a; //定义3个整型指针变量,指向a,b,c
p2=&b;
p3=&c;
void max3(int *x,int *y,int *z);//函数声明
max3(p1,p2,p3);//函数调用
printf("由大到小排序:%d %d %d\n",a,b,c);
//打印结果
return 0;
}
void max3(int *x,int *y,int *z)//函数定义
{
void swap(int *m,int *n);//swap函数声明
if(*x<*y)swap(x,z);//调用
if(*x<*z)swap(x,z);
if(*y<*z)swap(y,z);
}
void swap(int *m,int *n)//swap函数定义
{
if(*m<*n)
{
int s;
s=*m;
*m=*n;
*n=s;
}
}
5.有一个整型数组a,有10个元素,要求输出数组中的全部元素。
3种方式输出,用指针速度快
#include<stdio.h>
int main()
{
int a[10];
int i;
int *p=a;//p指针指向a数组首地址
printf("please enter 10 integer numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);//输入10个数
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
//数组元素用数组名和下标表示
for(i=0;i<10;i++)
printf("%d\t",*(a+i));
printf("\n");
//通过数组名和元素序号计算元素地址找到该元素
for(p=a;p<(a+10);p++)
printf("%d\t",*p);
//用指针指向当前的数组元素
return 0;
}
6.将数组a中n个整数按相反顺序存放。
#include<stdio.h>
int main()
{
//将数组a中n个整数按相反顺序存放。
void inv(int x[],int n);//函数声明
int i;
int a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:\n");
for(i=0;i<10;i++)
printf("%3d",a[i]);//打印原数组
printf("\n");
inv(a,10);//函数调用
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%3d",a[i]);//输出改变后的数组
}
void inv(int x[],int n)//函数定义
{
int temp,i,j;
int m=(n-1)/2;
for(i=0;i<=m;i++)//i:前5个 j:后5个 前后对调
{
j=n-1-i;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
7.练习用指针变量作实参
#include<stdio.h>
int main()
{
//将数组a中n个整数按相反顺序存放。
//用指针变量作实参
void inv(int *x,int n);//函数声明
int i,*arr;
printf("The original array:\n");
for(i=0;i<10;i++)
scanf("%2d",arr+i);//未给arr指针指向一个内存地址,编译器会警告
printf("\n");
inv(arr,10);//函数调用
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%2d",*(arr+i));
printf("\n");
return 0;
}
void inv(int *x,int n)//函数定义
{
int *p,*i,*j;
int m,temp;
m=(n-1)/2;
i=x;//i指向x指针
j=x+n-1;//j指向 与x指针相隔n-1的地址
p=x+m;//p指向 与x指针相隔m的地址
for(;i<=p;i++,j--)
//i指针指向的地址变化到p指针指向的地址 首尾互换
{
temp=*i;
*i=*j;
*j=temp;
}
}