<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">(一)思考思路</span>
1:一个复杂功能的程序,如果将所有的功能都写在主函数内,这样的程序的可读性太差,而且在理解的过程中很容易出现问题,所以将一些复杂功能,分块写入子函数,利用函数调用来实现模块功能是一个程序员必备的能力
2:函数调用:
主函数调用子函数包括这几部分:
1):子函数的类型(int void等),依据函数功能来使用函数类型,比如说 调用一个数组,想对其数据进行逆置,那么我们不用返回值,那么就用void就好啦,当需要子函数给主函数返回值的时候 就用int
2):调用的方式: 传址 ,传值
一些功能性的子函数(比如 将x,y的数值对换,数组的逆置等等)利用传值办法是无法实现对实参的改变的,通俗的将 形参就是对实参的一份拷贝,我们对copy的数据进行任何加工,对于原数据是没有任何办法的!比如说 现在有一个空水缸1,找一个copy的空水缸2(大小 容积等等的要素一模一样),无论我们对水缸2进行什么操作,对于水缸1都是没有意义的
于是我们引入指针这个概念,什么是指针,指针就是地址,我们通过指针找到实参,就可以对实参进行操作,通俗的将 在一个宾馆里,每一个房间都有一个标号(103,104等),前台通过这个标号通知里面的住户一系列的消息,指示用户做事情,这就是传址的用法
3):子函数如果要被主函数使用,那么在主函数必须对子函数进行声明,并且在需要实现子函数功能的地方对子函数进行传递实参,如
int main()
{
void copy(int x,int y); 函数的声明
............................
copy(a,b); 传递实参
}
3:注意事项(见代码)
(二)代码实现
#include <stdio.h>
#include <string.h>
void initialize(int *x,int n)
{
int i=0;
for(i=0;i<n;i++)
scanf("%d",x+i);
for(i=0;i<n;i++)
printf("%d ",*(x+i));
printf("\n");
}
void reverse(int arr, int *x,int n)
{
int i=0,sqm=(n-1)/2;
int temp=0;
int *l=NULL; <span style="color:#ff0000;">//对于空指针,一般是将NULL赋予指针</span>
l=x+n-1;
for(i=0;i<=sqm;x++,l--,i++)
{
temp=*x;
*x=*l;
*l=temp;
}
<pre name="code" class="cpp" style="font-size: 24px; font-weight: bold;"> <span style="color:#ff0000;"> // 千万注意,此处x指向的arr[5]的存储空间</span>
x=arr; for(i=0;i<n;i++)printf("%d ",*(x+i));printf("\n");}void empty(int *x,int n){ int i=0; for(i=0;i<n;i++) { *(x+i)=0;
//千万不能写成*x;那么在后面的for循环中每次
<span style="color:#ff0000;">执行的都是将arr[0]=0</span>
printf("%d ",*(x+i));
}
printf("\n");
}
int main()
{
int n = 8, i = 0;
int arr[8];
int *p=NULL;
p=arr;
initialize(p,8);
reverse(arr,p,8);
empty(p,8);
system("pause");
return 0;
}