zoukankan      html  css  js  c++  java
  • 数组按值和按地址传递

    转载自

    http://c.biancheng.net/cpp/html/1595.html

    在把数组作为参数传递给函数时,有值传递(by value)和地址传递(by reference)两种方式。在值传递方式中,在说明和定义函数时,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。例如,在下例中数组x[]是通过值传递方式传递给byval_func()函数的:

    # include <atdio.h>
    voidbyval_func(int[]);       /*the  byval_func()  function is passed an
                                    integer array by value * /
    void main (void);
    void main (void)
    {
        int x[10];
        int y;
         /* Set up the integer array. * /
         for (y=0; y<10;   y++)
            x[y] = y;
         /* Call byval_func() ,passing the x array by value. * /
         byval_func(x);
    }
    /* The byval_function receives an integer array by value. * /
    void byval_func(int i[])
    {
         int y;
         /* print the content: of the integer array. * /
         for (y=0; y<10;  y++)
             printf("%d ", i[y]);
    }

    在上例中,定义了一个名为x的数组,并对它的10个元素赋了初值。函数byval_func()的说明如下所示:
        intbyval_func(int []);
    参数int[]告诉编译程序byval_func()函数只有一个参数,即一个由int类型值组成的数组。在调用byval_func()函数时,只需将数组的地址传递给该函数,即:
        byval_func(x);
    在值传递方式中,数组x将被复制一份,复制所得的数组将被存放在栈中,然后由byval_func()函数接收并打印出来。由于传递给byal_func()函数的是初始数组的一份拷贝,因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。

    值传递方式的开销是非常大的,其原因有这样几点:
    第一,需要完整地复制初始数组并将这份拷贝存放到栈中,这将耗费相当可观的运行时间,因而值传递方式的效率比较低;
    第二,初始数组的拷贝需要占用额外的内存空间(栈中的内存);
    第三,编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。

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

    # include <atdio. h>
    void conat_func(const int* );
    void main (void);
    void main(void)
    {
        int x[10];
        int y;
         /* Set up the integer array. * /
         for (y=0; y<10; y++)
            x[y] =  y;
         /* Call conat_func(), passing the x array by reference. */
         conat_func(x);
    }
    /*The  const_function receives an integer array by reference.
       Notice that the pointer i» declared aa const, which renders
       it unmodif table by the conat_funcO function. * /
    void const_func(const int* i)
    {
         int y;
         / * print the contents of the integer array. * /
        for (y=0; y<10; y++)
             printf(""%d ", *(i+y));
    }

    在上例中,同样定义了一个名为x的数组,并对它的10个元素赋了初始值。函数const_func()的说明如下所示:
        int const_func(const int·);
    参数constint·告诉编译程序const_func()函数只有一个参数,即指向一个int类型常量的指针。在调用const_func()函数时,同样只需将数组的地址传递给该函数,即:
        const_func(x);
    在地址传递方式中,没有复制初始数组并将其拷贝存放在栈中,const_func()函数只接收到指向一个int类型常量的指针,因此在编写程序时要保证传递给const_func()函数的是指向一个由int类型值组成的数组的指针。const修饰符的作用是防止const_func()函数意外地修改初始数组中的某一个元素。

    地址传递方式唯一的不足之处是必须由程序本身来保证将一个数组传递给函数作为参数,例如,在函数const_func()的原型和定义中,都没有明确指示该函数的参数是指向一个由int类型值组成的数组的指针。然而,地址传递方式速度快,效率高,因此,在对运行速度要求比较高时,应该采用这种方式。

  • 相关阅读:
    C++实现希尔排序和快排
    操作系统重点知识汇总
    结构体(对齐规则及举例)
    指针和引用(传指针和传引用)
    数组和指针
    判断一个字符是否为数字的两种方法(C/C++)
    浅谈操作系统栈和堆(区别与联系)
    浅谈malloc/free和new/delete 的区别
    操作符和表达式
    windows重装系统后grub引导菜单修复方法(亲自实验过)
  • 原文地址:https://www.cnblogs.com/hong2016/p/6659090.html
Copyright © 2011-2022 走看看