理解指针作为函数的参数
先从交换两个数说起:
(一)所有功能在主函数中实现:
#include<stdio.h>
int main()
{
int x,y,t;
printf("请输入x和y:");
scanf("%d %d",&x,&y);
t=x,x=y,y=t;
printf("x=%d,y=%d\n",x,y);
}
(二)把两个变量值交换的功能用一个函数实现,要用指针作函数参数。
#include<stdio.h>
// 交换两个地址中的值的函数
void fun(int *m,int *n)
int t;
t=*m;*m=*n;*n=t;
}
int main()
{
int x,y,t;
printf("x,y=");
scanf("%d,%d",&x,&y);
fun(&x,&y); // 调用时传送地址
printf("x=%d,y=%d\n",x,y);
}
一维数组的指针
通过输入输出若干整数来理解:
(一)通过指针变量的移动实现数组元素的处理。
【指针移动法】
#include<stdio.h>
int main()
{
int a[10],i,*p; // 定义指向一维数组的指针变量p
p=a; // 指针变量p获取一维数组a的首地址
printf("请输入10个整数:");
for(i=0;i<=9;i++)
scanf("%d",p++); // 通过指针变量p表示每个元素的地址
p=a;
for(i=0;i<=9;i++)
printf("%5d",*p++); // 通过指针变量p输出每个元素的值
}
【指针不动法:指针+下标】
#include<stdio.h>
int main()
{
int a[10],i,*p; // 定义指向一维数组的指针变量p
p=a; // 指针变量p获取一维数组a的首地址
printf("请输入10个整数:");
for(i=0;i<=9;i++)
scanf("%d",p+i); // 通过指针变量p表示每个元素的地址
for(i=0;i<=9;i++)
printf("%5d",*(p+i)); // 通过指针变量p输出每个元素的值
}
(二)通过指向字符串的指针变量实现字符串的处理。
用指向字符串的指针变量实现多个字符串的输入输出:
这里用的是指针不动法:
#include<stdio.h>
main()
{
char a[5][20],(*p)[20]; // 定义指向多个字符串的指针变量p
int i;
p=a; // 指针变量p指向二维字符数组a
printf("请输入5个字符串\n");
for(i=0;i<=4;i++)
{
printf("请输入第 %d 个字符串: ",i+1);
scanf("%s",p+i); // 通过指针变量p接收字符串
}
printf("您输入的 5 个字符串是:\n");
for(i=0;i<=4;i++)
printf("%s\n",p+i); // 通过指针变量p输出字符串
}
接下来是指针移动法:
#include<stdio.h>
main()
{
char a[5][20],(*p)[20]; // 定义指向多个字符串的指针变量p
int i;
p=a; // 指针变量p指向二维字符数组a
printf("请输入5个字符串\n");
for(i=0;i<=4;i++)
{
printf("请输入第 %d 个字符串: ",i+1);
scanf("%s",p++); // 通过指针变量p接收字符串
}
p=a;
printf("您输入的 5 个字符串是:\n");
for(i=0;i<=4;i++)
printf("%s\n",p++); // 通过指针变量p输出字符串
}
二维数组的指针
二维数组:定义一个3行3列的二维数组,通过指向二维数组的指针实现对数组元素的输入和输出。
用指向二维数组的指针处理:
#include<stdio.h>
main()
{
int a[3][3],i,j;
int (*p)[3]; // 定义指向二维数组的指针变量p
p=a; // 指针变量p获取二维数组的首地址
printf("请输入3行3列数据:\n");
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
scanf("%d",*(p+i)+j);
// 通过指针变量p接收数组元素的值
printf("你输入的3行3列数据是:\n");
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
printf("%4d",*(*(p+i)+j)); // 通过指针变量p打印数组元素
printf("\n");
}
}
把二维数组当一维数组来处理,实现对数组元素的输入和输出:
【方法】指针不动法
#include<stdio.h>
int main()
{
int a[3][3],i,j;
int *p; // 定义指针变量p
p=&a[0][0]; // 指针变量p获取二维数组的首地址
printf("请输入3行3列数据:\n");
for(i=0;i<=8;i++)
scanf("%d",p+i); // 通过指针变量p接收数组元素的值
printf("你输入的3行3列数据是:\n");
for(i=0;i<=8;i++)
{
printf("%4d",*(p+i));
// 通过指针变量p打印数组元素
if((i+1)%3==0) // 控制换行
printf("\n");
}
}
函数指针的应用
下面看一道例题:定义一个函数max_min,求数组a的最大值和最小值,将最大值和最小值分别存入形参指针pmax和pmin所指存储单元,函数原型如下:
void max_min(int a[],int n, int *pmax ,int *pmin)
在主函数中读入n和n个整数,调用上述函数,输出最大值和最小值。
我这里用C++的格式来实现:
#include<iostream>
using namespace std;
void max_min(int a[], int n, int *pmax, int *pmin)//指针函数:返回最大值和最小值的地址
{
*pmax=*pmin=a[0];
for(int i=1;i<n;i++)
{
if(*pmax<a[i])
*pmax=a[i]; //把a[i]赋值给最大值;
else if(*pmin>a[i])
*pmin=a[i];//把a[i]赋值给最小值;
}
}
int main()
{
int n;
int max,min;
int b[n];
cout<<"请输入整数的个数:";
cin>>n;
cout<<"请输入n个整数:" ;
for(int i=0;i<n;i++)
{
cin>>b[i]; //输入n个整数
}
max_min(b,n,&max,&min);//调用指针函数
cout<<"最大值、最小值为:" ;
cout<<max<<" "<<min<<endl;//最后输出的是
}