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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言中数组作为函数的参数以及返回值的使用简单入门

    函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收.类似的方式,可以使用多维数组形式参数. 方式-1 形式参数为指针如下.在下一章将学习什么是指针. void myFunction(int *param) { . . . } 方式-2 如下形式数组参数的大小: void myFunction(int param[10]) { . . . } 方式-3 如下形式

  • C语言 详细讲解数组参数与指针参数

    目录 一.C语言中的数组参数退化为指针的意义 二.二维数组参数 三.等价关系 四.被忽视的知识点 五.小结 一.C语言中的数组参数退化为指针的意义 C 语言中只会以值拷贝的方式传递参数 当向函数传递数组时: 将整个数组拷贝一份传入函数        × 将数组名看做常量指针传数组首元素地址    √ C 语言以高效作为最初设计目标: a) 参数传递的时候如果拷贝整个数组执行效率将大大下降. b) 参数位于栈上,太大的数组拷贝将导致栈溢出. 二.二维数组参数 二维数组参数同样存在退化的问题 二维数

  • C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n", i, str[i]); } void main() { char* p[3]; char str[][5] = {"abc&quo

  • C语言入门篇--函数及数组用法

    目录 函数 1.函数的作用 2.函数的构成 (1)返回值 (2)函数名 (3)形参列表 (4)函数体 数组 1.定义数组 1.1不进行初始化 1.2进行初始化 1.3不给定数组元素个数 2.数组的经典用法 2.1求数组大小.元素大小.元素个数 2.2遍历 面向过程编程:C语言是面向过程的语言:在C语言中,把大部分的功能以一个个函数呈现,就称之为面向过程编程: 函数 是面向过程编程最关键的语法结构. 1.函数的作用 1.从工程上讲,函数可以让我们的代码更具有结构性,让代码更好看. 2.函数可以提升

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

    目录 把数组名作函数参数的四种情况 思路 实参与形参的对应关系有以下四种情况 我们来看代码 一般函数作参数和数组名作参数区别 一般函数作参数 数组名作函数参数 把数组名作函数参数的四种情况 如果想要通过函数调用得到n个要改变的值 思路 ①在主函数中设n个变量,用n个指针变量指向它们 ②设计一个函数,有n个指针形参,在这个函数中改变这n个形参所指向的值 ③在主函数中调用这个函数,在调用时将n个指针变量做为实参,将它们的地址传给该函数的形参 ④在执行该函数的过程中,通过形参指针变量,改变它们所指向的

  • 详解C++编程中用数组名作函数参数的方法

    C++数组的概念 概括地说:数组是有序数据的集合.要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标.数组名和下标惟一地标识一个数组中的一个元素. 数组是有类型属性的.同一数组中的每一个元素都必须属于同一数据类型.一个数组在内存中占一片连续的存储单元.如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图所示. 引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系.许多好的算法都与

  • python3中函数参数的四种简单用法

    下面给大家介绍python3中函数参数的四种简单用法,具体内容如下所示: def print_two(*args): arg1, arg2 = args print "arg1: %r, arg2: %r" % (arg1,arg2) def print_two_again(arg1, arg2): print "arg1: %r, arg2: %r" % (arg1, arg2) def print_one(arg1): print "arg1: %r&

  • shell 使用数组作为函数参数的方法(详解)

    因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bash function showArr(){ arr=$1 for i in ${arr[*]}; do echo $i done } regions=("GZ" "SH" "BJ") showArr $regions exit 0 把代码保存为test.sh后执行,只输出了第一个元素. ./t

  • JS中不应该使用箭头函数的四种情况详解

    目录 箭头函数的一些缺点 1.不支持参数对象 2.无法通过apply.call.bind来改变this指针 什么时候不能使用箭头功能 1.请不要在构造函数中使用箭头函数 2.请不要在点击事件中操作this 3.请不要在对象的方法中使用箭头函数. 4.请不要在原型链中使用箭头函数 箭头函数给我们的工作带来了极大的方便,但是它们有什么缺点呢?我们应该一直使用箭头函数吗?我们应该在哪些场景中停止使用箭头函数? 现在,我们开始吧. 箭头函数的一些缺点 1.不支持参数对象 在箭头函数中,我们不能像在普通函

  • JSP向后台传递参数的四种方式总结

    Jsp页面传值的方法 一.通过Form表单提交传值 客户端通过Form表单提交到服务器端,服务器端通过 Java代码 request.getParameter(String xx); 来取得参数(xx)为参数名称. 通过get/post方式进行提交 二.通过隐藏域传值 通过在表单中加入一个隐藏域来提交到服务器端,这种方式的好处是可以在客户端加入一些自己想要加入的参数,以便得到相应的值. 客户端代码: Java代码 <input type="hidden" name="i

  • JavaScript数组去重的多种方法(四种)

    数组去重,一般需求是给你一个数组,调用去重方法,返回数值副本,副本中没有重复元素.一般来说,两个元素通过 === 比较返回 true 的视为相同元素,需要去重,所以,1 和 "1" 是不同的元素,1 和 new Number(1) 是不同的元素,{} 和 {} 是不同的元素(引用不同).(当然如果需求认为 {} 和 {} 算作相同的元素,那么解法就不一样了) method 1 使用两重循环 function unique(arr) { var res = []; for(var i =

  • MyBatis Mapper接受参数的四种方式代码解析

    这篇文章主要介绍了MyBatis Mapper接受参数的四种方式代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于单个参数而言,可以直接写#{param},这里的占位符名称没有限制,反正就一个参数一个占位符,不需要指定名称 对于多个参数,有常用的四种方式 根据位置排序号 public interface UserDao { public Integer addUser(String username, String password)

  • SpringMvc接受请求参数的几种情况演示

    说明: 通常get请求获取的参数是在url后面,而post请求获取的是请求体当中的参数.因此两者在请求方式上会有所不同. 1.直接将接受的参数写在controller对应方法的形参当中(适用于get提交方式) /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * * @param username * @param password * @return */ @GetMapping("/addUser1") public String addUser1(Str

随机推荐