内容正文:
8.3 指针变量作函数参数
指针与数组一样,可以作为函数的参数使用,本节将重点讲解指针在函数中的应用。
函数的参数不仅可以是整型、字符型和实型等基本数据类型的变量,还可以是指针类型。使用指针作为函数的参数更能体现函数的特点,增加程序设计的灵活性,增强函数的功能。使用指针作为函数参数实质上是采用地址传递的方式,将1个变量的地址传到另一函数中。
1、使用指针作为函数参数改写案例8-2的程序。
#include<stdio.h>
void exchange(int*p,int*q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void main()
{ int a,b;
int *t1,*t2;
printf("please input the number a and b:");
scanf("%d %d",&a,&b);
t1=&a;
t2=&b;
if(a>b)
exchange(t1,t2);
printf("the result is:%d %d",a,b);
}
2.使用指针作为函数参数用法小结
(1)和基本函数调用一样,指针应该在使用之前先定义,至少应在使用之前加以声明;否则在执行程序时系统要出现错误提示,程序不能编译通过。
(2)不能企图通过改变指针形参的值而使指针实参的值改变,也就是说不能通过修改形参的指向来改变实参指针的指向。C语言中实参变量和形参变量之间的传递是单向的“值传递”方式,指针变量作为函数参数也要遵循这一原则。虽然在调用函数时不能改变实参指针变量的值,但可改变实参指针变量所指变量的值,这正是指针参数的优势所在。
(3)在本程序中,在主函数中还可以省略指针变量t1和t2,也可以达到同样的设计目的,完整的程序如下:
#include<stdio.h>
void exchange(int*p,int*q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void main()
{ int a,b;
printf("please input the number a and b:");
scanf("%d %d",&a,&b);
if(a>b)
exchange(&a,&b);
printf("the result is:%d %d",a,b);
}
8.4 指针变量作函数参数
指针变量不仅可以指向基本类型的变量,也可以指向数组中的元素,在讲述相关内容之前,先回顾一下有关数组的定义及其概念。
1.数组与指针的关系
数组实质上是一组变量的有序集合,具有以下特点。
(1)同一数组中的每个元素的数据类型相同。
(2)数组在内存中占有一段连续的存储空间。
(3)数组下标是从0开始的自然数。
(4)数组名代表数组的首地址,也就是第1个数组元素的地址。
因此,只要把数组的首地址或某一元素的地址放到指针变量中,就在数组和指针之间建立起了联系,即可实现对数组元素的访问。
2.使用指针访问所指向数组中的元素
C语言规定:如果指针变量p已经指向数组中的1个元素,则可以通过改变指针的指向来实现对数组中其他元素的访问。
(1)指针的加减运算
如果用户想要控制指针变量指向数组中的其他元素,可以使用指针变量的加减运算,它有如下两种基本形式(其中p代表指针变量,i是1个自然数)。
· p+i(p-i):获得指针当前指向位置之后(前)i个元素的地址,以实现对该元素的访问,注意此时指针的指向并未改变。
· p++(p--):将指针从当前指向位置后移(前移)1个元素的位置,注意此时指针的指向已经发生改变。
习题
一、选择题
1.执行以下程序段后,m的值为_____。
int a[2][3]={{1,2,3},{4,5,6}};
int m,*p;
p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));
A.15 B.14 C.13 D.12
习题
2.以下程序的输出结果为_____。
void fun(int x,int y,int *cp,int *dp)
{
*cp=x+y;
*dp=x-y;
}
void main()
{
int a,b,c,d;
a=30;b=50;
fun(a,b,&c,&d);
printf("%d,%d
",c,d);
}
A.50,30 B.30,50 C.80,-20 D.80,20
3.函数调用时,若用数组名作实参,则传递给形参的是_____。
A.数组元素的个数 B.数组的起始地址
C.数组第一个元素的值 D.数组全部元素的值
4.若a是一维数组名,p是指针变量,是下列语句中非法的是_____。
A.p=a; B.p++ C.a++ D.p=&a[0]
5.若有以下定义:
int a[]={1,2,3,