C语言羁绊之int数组与函数

0,示例代码在文章末尾

1,定义函数数组

//coding 1
/*warning:在说明和定义函数时,要在数组参数的尾部加上一对方括号,
           括号里的数字表示数组的长度。*/
int arr[10] = {10,9,8,7,6,5,4,3,2,1};

2,往函数参数中传数组

         在第一步中我们定义了一个数组,那么我们接下来就开始写在main()函数中执行方法的写法吧

         首先往函数参数中传值分为两种,一为值传递,二是地址传递。那么它们分别是什么含义,并且有什么有缺点呢?    

      在值传递方式中,数组arr[ ]将被复制一份,复制所得的数组将被存放在栈中,然后由fun()函数接收并打印出来。由于传递给fun()函数的是初始数组的一份拷贝,因此在fun()函数内部修改传递过来的数组对初始数组没有任何影响。值传递方式的开销是非常大的,其原因有这样几点:

  1. 需要完整地复制初始数组并将这份拷贝存放到栈中,这将耗费相当可观的运行时间,因而值传递方式的效率比较低;
  2. 初始数组的拷贝需要占用额外的内存空间(栈中的内存);
  3. 编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。
//coding 2
int main{
    /* 值传递和指针传递相同 */
    fun(arr);
    return 0;
}

      地址传递方式克服了值传递方式的缺点,是一种更好的方式。在地址传递方式中,传递给函数的是指向初始数组的指针,不用复制初始数组,因此程序变得精练和高效,并且也节省了栈中的内存空间。在地址传递方式中,只需在函数原型中将函数的参数说明为指向数组元素数据类型的一个指针。

    但是它们的写法都相似,都和coding 2中的写法相同。

3,函数的写法

        这一步是最关键的一步,也体现了两种代码的差别,为了照顾不想看太多文字描述的童鞋们,这里先贴出代码,具体的讲解放在‘注三’(步骤后边即可见)里。其中,coding 3 是值传递,而coding 4 是指针传递。

//coding 3
/* 此方法应放在main()方法的前边,否则可能差找不到,引起错误 */
/* 此处传过来的数组名不必与传过来的数组名相同,eg:fun(int a[]){};也可以) */

fun(int arr[]){
    //TODO something you want
}

//coding 4
/* 方法规则与coding 3相同 */
fun(int *arr){
    //TODO something you want
}
 

4,函数中获取数组的值

        传完参数,接下来可定就是要使用它们啦!可是到底应该怎么使用呢!我们就以要获取arr[ ]数组中的第一个元素为例子,来编写两种不同的代码。

//coding 4.1
//值传递
fun(int arr[]){
    printf("The first number is : %d",arr[0]);
}

//coding 4.2
//指针传递
fun(int *a)
{
    printf("The first number is : %d", *s);
}

5,总结

希望大家在前边的四步已经对函数传int数组已经有了初步的了解,如果有什么问题,请大家不吝指教,在下边的评论区里讨论。


注三:首先在coding 3中,大家看到函数的传参值其实是一个数组的本身(即代表整个数组的内容),因此你在函数体内,可以通过arr[i]的方式获取到数组的值。相比来说,在coding 4中,传入的是 “* a”,那这个“*a”是什么呢,其实就是数组arr的第一个元素即整数10的地址,因此,大家可以在函数体内通过“*a”方式来获取到整数,即此时*a其实传回来的是一个数,而a就是该元素在内存中的地址(eg:2424352)。也可在函数体内通过“*(a+i)”来获取其他元素的值,其中i为数组的偏移量。

Example1:(此例子实现通过传值方式对整形数组arr[]的遍历)

#include <stdio.h>
/* 此处即表明传入的参数名不一定要与主函数中的参数名相等 */
fun(int a[])
{
    int i;            //注意此时i要提前定义,否则会错误
    for(i=0;i<10;i++)
        printf("%d ",a[i]);  
}
int main(){
    int arr[20] = {10,9,8,7,6,5,4,3,2,1};
    fun(arr);
    return 0;
}

Example2:(此例子实现通过指针方式对整形数组arr[]的遍历)

#include "stdio.h"
fun(int *a){
    while(*a != 0)
        printf("%d ",*a++);
 }
int main(){
    int a[20] = {10,9,8,7,6,5,4,3,2,1};
    fun(a);    
    return 0;
}
 
参考文献:http://c.biancheng.net/cpp/html/1595.html


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值