C语言之把数组名作函数参数的四种情况说明

 更新时间:2022年07月13日 14:32:35   作者:慢生活的人。  
这篇文章主要介绍了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++实现带头双向循环链表的示例详解

    C++实现带头双向循环链表的示例详解

    这篇文章主要介绍了如何利用C++实现带头双向循环链表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-12-12
  • Qt实现手动切换多种布局的完美方案

    Qt实现手动切换多种布局的完美方案

    通过点击程序界面上不同的布局按钮,使主工作区呈现出不同的页面布局,多个布局之间可以通过点击不同布局按钮切换,支持的最多的窗口为9个,不同布局下窗口数随之变化,这篇文章主要介绍了Qt实现手动切换多种布局的完美方案,需要的朋友可以参考下
    2024-07-07
  • c++快速排序详解

    c++快速排序详解

    快速排序总体思想:先找到一个枢轴,让他作为分水岭,通过一趟排序将待排序的记录分割成两部分,前面一部分都比枢轴小,后面一部分枢轴大,然后又分别对这两部分记录继续进行递归的排序,达到整个序列有序的目的
    2017-05-05
  • C语言实现空战游戏

    C语言实现空战游戏

    这篇文章主要为大家详细介绍了C语言实现空战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++将保存char、int 和double到txt文件中

    C++将保存char、int 和double到txt文件中

    这篇文章主要介绍了C++如何将保存char、int 和double到txt文件中,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • win32使用openfilename浏览文件窗口示例

    win32使用openfilename浏览文件窗口示例

    这篇文章主要介绍了使用win32 API打开浏览文件窗口,使用OPENFILENAME结构体来实现这个功能,需要的朋友可以参考下
    2014-02-02
  • OpenCV视频流C++多线程处理方法详细分析

    OpenCV视频流C++多线程处理方法详细分析

    为OpenCV是搞计算机视觉必须要掌握的基础,这篇文章主要给大家介绍了关于OpenCV视频流多线程处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • C语言中使用快速排序算法对元素排序的实例详解

    C语言中使用快速排序算法对元素排序的实例详解

    这篇文章主要介绍了C语言中使用快速排序算法对元素排序的实例详解,文中细分了几个情况来举例,在注释里有说明,需要的朋友可以参考下
    2016-04-04
  • 详解C++ 动态内存分配与命名空间

    详解C++ 动态内存分配与命名空间

    这篇文章主要介绍了详解C++ 动态内存分配与命名空间,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • C++编程中的函数指针初步解析

    C++编程中的函数指针初步解析

    这篇文章主要介绍了C++编程中的函数指针初步解析,函数指针在C语言和C++学习中都是非常重要的知识,需要的朋友可以参考下
    2016-04-04

最新评论