C语言中,将数组名作为函数参数的四种情况,究竟有何奥秘?

2026-04-12 09:131阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1598个文字,预计阅读时间需要7分钟。

C语言中,将数组名作为函数参数的四种情况,究竟有何奥秘?

目录+ 数组名作为函数参数的四种情况+ 思路+ 实参与形参的对应关系+ 数组名作为函数参数的四种情况

我们来看代码+ 一般函数参数和数组名作为函数参数的区别+ 一般函数参数+ 数组名作为函数参数+ 将数组名作为函数参数时的参数区分配

目录
  • 把数组名作函数参数的四种情况
    • 思路
    • 实参与形参的对应关系有以下四种情况
    • 我们来看代码
  • 一般函数作参数和数组名作参数区别
    • 一般函数作参数
    • 数组名作函数参数

把数组名作函数参数的四种情况

如果想要通过函数调用得到n个要改变的值

思路

①在主函数中设n个变量,用n个指针变量指向它们

②设计一个函数,有n个指针形参,在这个函数中改变这n个形参所指向的值

③在主函数中调用这个函数,在调用时将n个指针变量做为实参,将它们的地址传给该函数的形参

④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值

⑤主调函数中就可以使用这些改变了值的变量

同样,数组是一些连续变量的容器,当然也可以通过函数也改变数组中的值。

如果有一个实参数组,想要在函数中改变此数组中的元素的值

实参与形参的对应关系有以下四种情况

1.实参和形参都是数组名

2.实参是数组名,形参是指针变量

3.实参是指针变量,形参是数组名

4.实参和形参都是指针变量

我们来看代码

1.实参和形参都是数组名

# include <stdio.h> //实参用属组名,形参也用数组名 int main(void) {     void inv(int arr[], int n);     int array[10], i;     printf("Please enter ten integer numbers: \n");     for (i=0; i<10; i++)         scanf("%d", &array[i]);     printf("original array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     inv(array, 10);     printf("reversed array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     return 0; } void inv(int arr[], int n) {     int temp, m, i;     m = (n-1)/2         ;     for (i=0; i<=m; i++)     {         temp = arr[i];         arr[i] = arr[n-1-i];         arr[n-1-i] = temp;     }      }

2.实参是数组名,形参是指针变量

# include<stdio.h> //实参用数组名,形参使用指针变量 int main(void) {     void inv(int * p, int n);     void inv2(int * p, int n);     int array[10], i;     printf("Please enter ten integer numbers: \n");     for (i=0; i<10; i++)         scanf("%d", &array[i]);     printf("original array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     inv2(array, 10);     printf("reversed array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     return 0; } void inv(int * p, int n) {     int temp, i, m;                //定义普通变量     m = (n-1)/2;     for (i=0; i<=m; i++)     {         temp = *(p+i);            //使用指针指向的值进行交换         *(p+i) = *(p+n-1-i);             *(p+n-1-i) = temp;     } } void inv2(int * p, int n) {     int * i, temp, * j, m;            //定义指针变量     j = p+n-1;     m = (n-1)/2;     for (i=p; i<p+m; i++, j--)     {         temp = *i;                             *i = *j;         *j = temp;     } }

4.实参和形参都是指针变量

# include<stdio.h> //使用指针变量作实参,指针变量作形参 int main(void) {     void inv3(int * p, int n);     void inv4(int * p, int n);     int array[10], i, * p;     p = array;     printf("Please enter ten integer numbers: \n");     for (i=0; i<10; i++)         scanf("%d", &array[i]);     printf("original array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     inv4(p, 10);     printf("reversed array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     return 0; } void inv3(int * p, int n) {     int i, temp, m;     m = (n-1)/2;     for (i=0; i<=m; i++)     {         temp = *(p+i);         *(p+i) = *(p+n-1-i);         *(p+n-1-i) = temp;     } } void inv4(int * p, int n) {     int * i, * j, temp, m;     m = (n-1)/2;     j = p+n-1;     for (i=p; i<=p+m; i++, j--)     {         temp = *i;         *i = *j;         *j = temp;              } }

其中在inv函数中,无论是使用指针变量还是使用数组名,改变的只是实参指针变量所指向的变量的值。

牢记一句话(我认为是学习指针的重中之重,以不变应万变):

C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。

一般函数作参数和数组名作参数区别

此次区别的分析来源于实践之后…

代码示例:

一般函数作参数

#include<stdio.h> void main() { float a,b; float add(float a,float b); scanf("%f%f",&a,&b); add(a,b); printf("输出主函数的a=%f\n",a); } float add(float a,float b) { a=a+b; printf("输出子函数的a=%f\n",a); return a; }

运行结果:

数组名作函数参数

#include<stdio.h> void main() { float a[1],b; float add(float a[],float b); scanf("%f%f",&a[0],&b); add(a,b); printf("输出主函数的a=%f\n",a[0]); } float add(float a[],float b) { a[0]=a[0]+b; printf("输出子函数的a=%f\n",a[0]); }

运行结果:

原理解释:

由代码一输出结果可知,一般函数作参数(在子函数中),其形参数据不能够改变实参数据的。所以输出主函数的a=3.000000

C语言中,将数组名作为函数参数的四种情况,究竟有何奥秘?

由代码二输出结果可知,数组名作函数参数(尤其在子函数中)可通过形参(指针变量)是可以改变实参数据的。这突显了数组的普适性,功能性强优于其他一般函数。(个人拙见)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

标签:四种

本文共计1598个文字,预计阅读时间需要7分钟。

C语言中,将数组名作为函数参数的四种情况,究竟有何奥秘?

目录+ 数组名作为函数参数的四种情况+ 思路+ 实参与形参的对应关系+ 数组名作为函数参数的四种情况

我们来看代码+ 一般函数参数和数组名作为函数参数的区别+ 一般函数参数+ 数组名作为函数参数+ 将数组名作为函数参数时的参数区分配

目录
  • 把数组名作函数参数的四种情况
    • 思路
    • 实参与形参的对应关系有以下四种情况
    • 我们来看代码
  • 一般函数作参数和数组名作参数区别
    • 一般函数作参数
    • 数组名作函数参数

把数组名作函数参数的四种情况

如果想要通过函数调用得到n个要改变的值

思路

①在主函数中设n个变量,用n个指针变量指向它们

②设计一个函数,有n个指针形参,在这个函数中改变这n个形参所指向的值

③在主函数中调用这个函数,在调用时将n个指针变量做为实参,将它们的地址传给该函数的形参

④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值

⑤主调函数中就可以使用这些改变了值的变量

同样,数组是一些连续变量的容器,当然也可以通过函数也改变数组中的值。

如果有一个实参数组,想要在函数中改变此数组中的元素的值

实参与形参的对应关系有以下四种情况

1.实参和形参都是数组名

2.实参是数组名,形参是指针变量

3.实参是指针变量,形参是数组名

4.实参和形参都是指针变量

我们来看代码

1.实参和形参都是数组名

# include <stdio.h> //实参用属组名,形参也用数组名 int main(void) {     void inv(int arr[], int n);     int array[10], i;     printf("Please enter ten integer numbers: \n");     for (i=0; i<10; i++)         scanf("%d", &array[i]);     printf("original array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     inv(array, 10);     printf("reversed array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     return 0; } void inv(int arr[], int n) {     int temp, m, i;     m = (n-1)/2         ;     for (i=0; i<=m; i++)     {         temp = arr[i];         arr[i] = arr[n-1-i];         arr[n-1-i] = temp;     }      }

2.实参是数组名,形参是指针变量

# include<stdio.h> //实参用数组名,形参使用指针变量 int main(void) {     void inv(int * p, int n);     void inv2(int * p, int n);     int array[10], i;     printf("Please enter ten integer numbers: \n");     for (i=0; i<10; i++)         scanf("%d", &array[i]);     printf("original array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     inv2(array, 10);     printf("reversed array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     return 0; } void inv(int * p, int n) {     int temp, i, m;                //定义普通变量     m = (n-1)/2;     for (i=0; i<=m; i++)     {         temp = *(p+i);            //使用指针指向的值进行交换         *(p+i) = *(p+n-1-i);             *(p+n-1-i) = temp;     } } void inv2(int * p, int n) {     int * i, temp, * j, m;            //定义指针变量     j = p+n-1;     m = (n-1)/2;     for (i=p; i<p+m; i++, j--)     {         temp = *i;                             *i = *j;         *j = temp;     } }

4.实参和形参都是指针变量

# include<stdio.h> //使用指针变量作实参,指针变量作形参 int main(void) {     void inv3(int * p, int n);     void inv4(int * p, int n);     int array[10], i, * p;     p = array;     printf("Please enter ten integer numbers: \n");     for (i=0; i<10; i++)         scanf("%d", &array[i]);     printf("original array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     inv4(p, 10);     printf("reversed array:\n");     for (i=0; i<10; i++)         printf("%2d", array[i]);     printf("\n");     return 0; } void inv3(int * p, int n) {     int i, temp, m;     m = (n-1)/2;     for (i=0; i<=m; i++)     {         temp = *(p+i);         *(p+i) = *(p+n-1-i);         *(p+n-1-i) = temp;     } } void inv4(int * p, int n) {     int * i, * j, temp, m;     m = (n-1)/2;     j = p+n-1;     for (i=p; i<=p+m; i++, j--)     {         temp = *i;         *i = *j;         *j = temp;              } }

其中在inv函数中,无论是使用指针变量还是使用数组名,改变的只是实参指针变量所指向的变量的值。

牢记一句话(我认为是学习指针的重中之重,以不变应万变):

C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。

一般函数作参数和数组名作参数区别

此次区别的分析来源于实践之后…

代码示例:

一般函数作参数

#include<stdio.h> void main() { float a,b; float add(float a,float b); scanf("%f%f",&a,&b); add(a,b); printf("输出主函数的a=%f\n",a); } float add(float a,float b) { a=a+b; printf("输出子函数的a=%f\n",a); return a; }

运行结果:

数组名作函数参数

#include<stdio.h> void main() { float a[1],b; float add(float a[],float b); scanf("%f%f",&a[0],&b); add(a,b); printf("输出主函数的a=%f\n",a[0]); } float add(float a[],float b) { a[0]=a[0]+b; printf("输出子函数的a=%f\n",a[0]); }

运行结果:

原理解释:

由代码一输出结果可知,一般函数作参数(在子函数中),其形参数据不能够改变实参数据的。所以输出主函数的a=3.000000

C语言中,将数组名作为函数参数的四种情况,究竟有何奥秘?

由代码二输出结果可知,数组名作函数参数(尤其在子函数中)可通过形参(指针变量)是可以改变实参数据的。这突显了数组的普适性,功能性强优于其他一般函数。(个人拙见)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

标签:四种