C程序设计
----教学过程篇数组与指针
用数组名作为函数的参数
1.如果是自定义函数中是使用的数组作为函数的参数,则实参向函数中传递的是数组的首地值,那意味着对形参的改变就会影响到实参的改变
2.如果自定义函数中是使用的普通变量作为函数的参数,则实参向函数中传递的仅仅是实参的值,那么意味着形参值的改变将不会对实参的值造成影响数组与指针(程序一)
#include <stdio.h>
#include <stdlib.h>
#define N 10
void swaparr(int array1[],int number);
void swapval(int x,int y);
void input(int array1[],int number);
void input(int array1[],int number)
{
int *p;
p=array1;
printf("please input %d numbers\n",N);
数组与指针(程序一)
for(;p<array1+number;p++)
{
scanf("%d",p);
}
}
void swaparr(int array1[],int number)
{
int i,temp;
if((number%2)==0)
{
for(i=0;i<=(number-2)/2;i++)
数组与指针(程序一)
{
temp=array1[i];
array1[i]=array1[number-1-i];
array1[number-1-i]=temp;
}
}
if((number%2)!=0)
{
for(i=0;i<(number-1)/2;i++)
{
temp=array1[i];
array1[i]=array1[number-1-i];
数组与指针(程序一)
array1[N-1-i]=temp;
}
}
}
void swapval(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
数组与指针(程序一)
main()
{
int array[N],*p,x=1,y=2;
p=array;
input(p,N);
printf("交换前数组中的值,\n");
for(p=array;p<array+N;p++)
{
printf("%3d",*p);
}
printf("\n");
数组与指针(程序一)
p=array; //上面的循环已经将指针指向了别的元素,而非第一个元素
swaparr(p,N);
p=array; //上面的循环已经将指针指向了别的元素,
而非第一个元素
printf("交换后数组中的值,\n");
for(p=array;p<array+N;p++)
{
printf("%3d",*p);
}
printf("\n");
printf("交换前 x,y中的值,\n");
数组与指针(程序一)
printf("%3d,%3d",x,y);
printf("\n");
swapval(x,y);
printf("交换后 x,y中的值,\n");
printf("%3d,%3d",x,y);
printf("\n");
system("pause");
}
预测上述程序的输出结果数组与指针
上述程序中应注意的问题:
1.如果用户自定义函数中的形参是数组,则实参中可以添数组名,也可以填一个指针变量,该指针变量指向数组的首地址例如,int array[10],*p;
p=array;
swaparr(p,10);
等价于,swaparr(array,10);
数组与指针
2.在每次使用指针的时候一定要将指针复位,也就是重新将指针指向数组的首地址,程序中多次对指针进行复位例如,int array[10],*p;
p=array;
input(p,10);
p=array;
swaparr(p,10);
数组与指针
3.swaparr()函数的形参是数组名,所以填实参到括号中既进行了地址传递,
当形参改变时,实参中数组的内容也被改变了
swap()函数的形参是变量,所以没有填实参到括号中仅仅是进行的值传递,
实参的值不受形参值改变的影响数组与指针
一般来说,如果有一个实参数组,
想在函数中改变此数组的元素的值,实参和形参的对应关系有以下的 4种类型
1.实参和形参都用数组名
main() f(int a[],int n)
{ {
int a[10];
f(a,10);
} }
数组与指针
2.实参用数组名,形参用指针变量
main() f(int *x,int n)
{ {
int a[10];
f(a,10);
} }
数组与指针
3,实参和形参都用指针变量
main() f(int *x,int n)
{ {
int a[10],*p;
p=a;
f(p,10);
} }
数组与指针
4.实参为指针变量,形参为数组变量
main() f(int a[],int n)
{ {
int a[10],*p;
p=a;
f(p,10);
} }