C语言指针基础知识点(五)--用数组名作函数参数
前期回顾 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过指针引用数组用数组名做函数参数数组元素作实参时,参数传递具有单向性,即实参的改变可以影响形参,而形参的改变无法影响实参。例:假设已经定义了一个函数,其原型为:void swap(int x...
指针系列目录
C语言指针基础知识点(一)–指针及指针变量
C语言指针基础知识点(二)–指针变量的引用
C语言指针基础知识点(三)–指针变量作为函数参数
C语言指针基础知识点(四)–通过指针引用数组
C语言指针基础知识点(五)–用数组名作函数参数
C语言指针基础知识点(六)–通过指针引用多维数组
C语言指针基础知识点(七)–通过指针引用字符串
C语言指针基础知识点(八)–返回指针值的函数
C语言指针基础知识点(九)–指针数组和多重指针
C语言指针基础知识点(十)–动态内存分配与指向它的指针变量
用数组名做函数参数
数组元素作实参时,参数传递具有单向性,即实参的改变可以影响形参,而形参的改变无法影响实参。例:
假设已经定义了一个函数,其原型为:
void swap(int x, int y);
假设函数的作用是将两个形参(x, y)的值交换,今有以下的函数调用:
swap(int a[1], int a[2]);
但是,
当数组名作函数参数时,实参和形参的改变可以相互影响。因为实参数组名代表首元素的地址,而形参是用来接收从实参传递过来的数组首元素的地址的,因此形参是一个指针变量。
int main()
{
void fun(int arr[], int n); //对fun函数的声明
int array[10];
......
fun(array, 10); // 用数组名作函数的参数
return 0;
}
void fun(int arr[], int n)
{
......
}
下面,把变量名作为函数参数与把数组名作为函数参数相互比较,可以得到:
实参类型 | 变量名 | 数组名 |
---|---|---|
要求形参的类型 | 变量名 | 数组名或指针变量 |
传递的信息 | 变量的值 | 实参数组首元素的地址 |
通过函数调用能否改变实参的值 | 不能 | 能 |
栗子1:
将数组 a 中 n 个整数按相反顺序存放
方法1:
# include<stdio.h>
int main()
{
void inv(int x[], int n);
int i, a[10];
printf("Please enter 10 integer numbers:\n");
for(i=0;i<10;i++)
scanf("%d", &a[i]);
inv(a,10);
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void inv(int x[], int n)
{
int temp, j;
for(j=0;j<=(n-1)/2;j++)
{
temp = x[j];
x[j] = x[n-j-1];
x[n-j-1] = temp;
}
}
利用指针变量当形参
方法2:
# include<stdio.h>
int main()
{
void inv(int *x, int n);
int i, a[10];
printf("Please enter 10 integer numbers:\n");
for(i=0;i<10;i++)
scanf("%d", &a[i]);
inv(a,10);
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void inv(int *x, int n)
{
int temp, j, m=(n-1)/2;
for(j=0;j<=m;j++)
{
temp = *(x+j);
*(x+j) = *(x+n-j-1);
*(x+n-j-1) = temp;
}
}
方法3:
# include<stdio.h>
int main()
{
void inv(int *x, int n);
int i, a[10];
printf("Please enter 10 integer numbers:\n");
for(i=0;i<10;i++)
scanf("%d", &a[i]);
inv(a,10);
printf("The array has been inverted:\n");
for(i=0;i<10;i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void inv(int *x, int n)
{
int temp, *i, *j, *p, m=(n-1)/2;
i=x; j=x+n-1; p=x+m;
for(;i<=p;i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
如果让指针变量做形参,必须先使指针变量有确定值,指向一个已定义的对象
栗子2:
用指针方法对10个整数按由小到大顺序排列
方法1:
# include<stdio.h>
int main()
{
void sort(int x[], int n);
int i, a[10], *p;
p = a;
printf("Please enter 10 integer numbers:\n");
for(i=0;i<10;i++)
scanf("%d", p++);
p = a; // 重新返回指向首地址
sort(p,10);
printf("The array has been inverted:\n");
p = a;
for(i=0;i<10;i++,p++)
printf("%d ", *p);
printf("\n");
return 0;
}
void sort(int x[], int n)
{
int i, j, k, temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(x[i]<x[j])
{
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
方法2:
形参为指针
# include<stdio.h>
int main()
{
void sort(int *x, int n);
int i, a[10], *p;
p = a;
printf("Please enter 10 integer numbers:\n");
for(i=0;i<10;i++)
scanf("%d", p++);
p = a;
sort(p,10);
printf("The array has been inverted:\n");
p = a;
for(i=0;i<10;i++,p++)
printf("%d ", *p);
printf("\n");
return 0;
}
void sort(int *x, int n)
{
int i, j, k, temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(*(x+i)<*(x+j))
{
temp = *(x+i);
*(x+i) = *(x+j);
*(x+j) = temp;
}
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)