内容正文:
第8章 指针
本章内容
8.1指针与指针变量
8.2 指针与数组
8.3 指针与字符串
8.4指针与函数
8.5命令行参数
8.6指向指针的指针变量
8.7综合案例
8.4指针与函数
8.4.1指针作为函数的形参
指向变量的指针作为函数的形参
#include <stdio.h>
void add(int a)
{
a++;
}
main()
{
int b=5;
add(b);
printf("b=%d",b);
}
#include <stdio.h>
void add(int *a)
{
(*a)++;
}
main()
{
int b=5;
add(&b);
printf("b=%d",b);
}
注意事项
当形参为指针变量时,其对应的实参可以是指针变量或存储单元地址
当形参为指针变量时,在函数体内如果修改传递过来的存储地址的内容,会影响实参的值
当形参为指针变量时,在函数体内如果修改指针形参传递过来的存储地址,不会改变实参指向的地址
#include <stdio.h>
void swap(int *a,int *b)
{
int *t;
t=a;
a=b;
b=t;
}
main()
{
int a=5,b=6;
int *pa,*pb;
pa=&a;
pb=&b;
swap(pa,pb);
printf("
*pa=%d,*pb=%d
",*pa,*pb);
}
运行上面的程序,输出结果为:
*pa=5,*pb=6
#include <stdio.h>
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
main()
{
int a=5,b=6;
int *pa,*pb;
pa=&a;
pb=&b;
swap(pa,pb);
printf("
*pa=%d,*pb=%d
",*pa,*pb);
}
运行上面的程序,输出结果为:
*pa=6,*pb=5
程序举例
【例8.12】编写一个函数计算一个数组中的最大值和最小值。
#include <stdio.h>
void maxmin(int a[],int n,int *max,int *min)
{
int i;
int tmax; /*用来保存最大值*/
int tmin; /*用来保存最小值*/
tmax=a[0];
tmin=a[0];
for(i=0;i<n;i++)
{
if(tmax<a[i])
tmax=a[i];
else if(tmin>a[i])
tmin=a[i];
}
*max=tmax;
*min=tmin;
}
main()
{
int a[10];
int i;
int max,min;
printf("
Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
maxmin(a,10,&max,&min);
printf("
max=%d,min=%d
",max,min);
}
指向数组的指针作为函数的形参
【例8.13】编写程序,用户输入一个字符串s,将字符串s中下标为奇数的字符删除。例如,当s所指字符串中的内容为siegAHdied,则删除后数组中的内容应是seAde。(主要功能用函数实现)
#include <stdio.h>
void deletechar(char *s)
{
char *p;
int i=0;
p=s; /*p初始化为字符串首地址*/
while(*p!='\0')
{
if(i%2==0)
{
*s=*p;
s++;
}
p++;
i++;
}
*s='\0';
}
main()
{
char s[80];
printf("
Please input a string:");
gets(s);
deletechar(s);
puts("
After deleted:");
puts(s);
}
指针数组作为函数的形参
【例8.14】将5个国名按字母顺序排序后输出。
#include"string.h"
main()
{
void sort(char *name[],int n);
void print(char *name[],int n);
char *name[]={ "CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[],int n)
{
char *pt