二级C语言试题讲解——指针(3)
认证攻关
一、理论讲解
1.指针变量作为函数的参数
当函数的形参是可以接收地址的指针变量时,而实参以相同类型数据的地址调用该函数,则形参通过地址得到实参的数据,而且也可以通过该地址将改变后的数据传回给实参,从而达到函数之间数据传递的目的。
2.指针变量与数组结合作为函数的参数
数组或字符串在函数间的传递也可以通过指针变量或数组实现。它们用的是传递地址的方法。具体的可以有以下几种结合形式。
(1)实参与形参都用数组名;(2) 实参用数组名,形参用指针变量;(3) 实参用指针变量,形参用数组名;(4) 实参与形参都使用指针变量。
在以上的任何一种形式中,如果形参接收对应实参的首地址,即可以理解为形参与实参共用同一个存储单元。在调用时为了使函数具有通用性,可以再设另外一个形参接收数组的元素个数。而对于字符串数组或字符串指针变量一般不再另设形参接收数组的元素个数。而是利用字符串的结束符做相应的运算。
二、典型试题解析
例1:程序运行时输入两个整数2和8,写出其运行结果。
swap(int *p1,int *p2)
{ int t;
t=*p1;*p1=*p2;*p2=t;
}
main()
{ int a,b,*pa,*pb;
scanf("%d%d",&a,&b;
pa=&a ,pb=&b;
if(a<b)swap(pa,pb);
printf("\n a=%d,b=%d\n",a,b);
}
运行情况如下,输入:2 8
输出:a=8,b=2
例题分析:这里,函数swap的形参是指针,主函数中调用函数swap的实参也是指针。在调用函数时实参pa、pb将a、b变量的地址传给形参p1和p2,此时*p1和*p2的值实际上就是变量a和b的值。因此,在函数中*p1和*p2的值进行交换就相当于变量a和b的值交换。所以返回主函数变量a和b的值是交换后的值,相当于将函数中*p1和*p2改变后的值传回主函数。
考察重点:此题要求考生掌握指针变量在函数中是如何通过地址的传递实现值的传递。
例2:下面程序段的运行结果是。答案:B
void inv(int *b,int n)
{ int t,i,j,k;
k=n/2;
for(i=0;i<k;i++)
{ j=n-1-i;t=b[i];b[i]=b[j];b[j]=t;
}
}
main()
{ int i,a[10]={2,4,6,8,10,9,7,5,3,1},*p=a;
for(i=0;i<10;i++) printf("%3d",&a[i]);
printf("\n");
inv (p,10);
for(i=0;i<10;i++) printf("%3d",&a[i]);
}
A. 2 4 6 8 10 9 7 5 3 1
2 4 6 8 10 9 7 5 3 1
B.2 4 6 8 10 9 7 5 3 1
1 3 5 7 9 10 8 6 4 2
C. 2 4 6 8 10 9 7 5 3 1
10 8 6 4 2 9 7 5 3 1
D.2 4 6 8 10 9 7 5 3 1
1 3 5 7 9 2 4 6 8 10
例题分析:由定义中的*p=a,可知p中存放了数组a的首地址。在语句inv (p,10)调用函数时指针变量p作为实参将数组a的首地址传给了形参指针变量b,常数10作为数组元素个数传给了形参n。因此,函数中对指针变量b的操作就相当于对数组a的操作。函数中的循环体是完成b[i]和b[j]对应元素的交换。因为i从0变化到4(k=5),j从9变化到5,所以相当于b[0]与b[9]交换,b[1]与b[8]交换,以此类推,最后是b[4]与b[5]交换。由于指针变量b指向了a数组,因此交换后的结果传回给a 数组。输出结果为B。
考察重点:该题主要是让考生弄清楚指针变量在与数组结合时,在函数中可以完成数据的双向传递,调用中需要传递数组元素个数。
例3:以下程序的功能是将字符串a复制到字符串b中,请将程序补充完整。
答案:① a,b ② *p1!='\0' ③ p1++,p2++ ④ *p2=*p1 ⑤ *p2='\0'
void copy(char *p1,char *p2)
{ for(;②;③)
④;
⑤;
}
main()
{ char a[]="Good!",b[80];
Copy(①);
printf("%s\n %s\n",a,b);
}
例题分析:根据程序功能在主程序中需要将字符串a和字符串b的地址传给函数,所以第①个空用 a,b 。而函数在接受了字符串后要完成复制的工作,因此,for循环的结束条件应在到a字符串的结束符为止,所以,第②个空用*p1!='\0'结束循环,第③个空用 p1++,p2++主要是考虑当一个字符复制以后指针需要指向下一个字符和下一个要复制的存储空间,第④个空*p2=*p1则是完成复制工作。由于循环遇到'\0'就结束,在退出循环时需要将字符串b的尾部赋给'\0',⑤ *p2='\0'就是起此作用的。
考察重点:该例题主要是让考生弄清楚用字符指针和字符数组结合时,在函数中进行字符串的传递不需要传字符个数,而是通过字符串的结束符对字符串进行处理的方法来解决。