Передать массив в функцию по значению - PullRequest
36 голосов
/ 23 января 2011

Ниже приведен фрагмент из книги C Программирование. Только часто задаваемые вопросы . Разве это не неправильно, так как массивы никогда не могут быть переданы по ссылке?

VIII.6: Как передать массив функции по значению?

Ответ: Массив можно передать функции по значению, объявив в вызываемая функция имя массива с квадратными скобками ([ и ]) прикреплен к концу. При вызове функция, просто передать адрес массив (то есть имя массива) к вызываемой функции. Например, следующая программа передает массив x[] к названной функции byval_func() по значению:

Параметр int[] сообщает компилятор, который byval_func() функция будет принимать один аргумент - массив целых чисел. Когда byval_func() функция вызывается, вы передать адрес массива byval_func():

byval_func(x);

Поскольку массив передается значение, точная копия массива сделано и помещено в стек. вызываемая функция затем получает это копия массива и может распечатать его. Поскольку массив передан byval_func() является копией оригинальный массив, модифицирующий массив в рамках функции byval_func() имеет не влияет на исходный массив.

Ответы [ 4 ]

59 голосов
/ 23 января 2011

Поскольку массив передается по значению, создается точная копия массива и помещается в стек.

Это неверно: сам массив не копируется , только копия указателя на его адрес передается вызываемому объекту (помещается в стек). (Независимо от того, объявлен ли параметр как int[] или int*, он распадается на указатель .) Это позволяет изменять содержимое массива из в вызываемой функции . Таким образом, это

Поскольку массив, переданный byval_func (), является копией исходного массива, изменение массива в функции byval_func () не влияет на исходный массив.

совершенно неверно (спасибо Джонатану Леффлеру за его комментарий ниже). Однако переназначение указателя внутри функции не изменит указатель на исходный массив вне функции.

51 голосов
/ 23 января 2011

Сожги эту книгу.Если вам нужен настоящий FAQ по C, который не был написан начинающим программистом, используйте этот: http://c -faq.com / aryptr / index.html .

Синтаксически, строго говоря, вы не можете передать массив по значению в C.

void func (int* x); /* this is a pointer */

void func (int x[]); /* this is a pointer */

void func (int x[10]); /* this is a pointer */

Однако , для записи естьподвох в C, который позволяет вам передавать массив по значению в C. Не пытайтесь сделать это дома!Потому что, несмотря на этот трюк, по-прежнему нет причин передавать массив по значению.

typedef struct
{
  int my_array[10];
} Array_by_val;

void func (Array_by_val x);
1 голос
/ 13 июня 2012

В C и C ++ невозможно передать полный блок памяти по значению в качестве параметра функции, но нам разрешено передавать ее адрес. На практике это имеет почти тот же эффект, и это гораздо более быстрая и эффективная операция.

Чтобы быть в безопасности, вы можете передать размер массива или поставить спецификатор const перед указателем, чтобы вызываемый объект не изменил его.

0 голосов
/ 10 июня 2013
#include<stdio.h>
void  fun(int a[],int n);
int main()
{
    int a[5]={1,2,3,4,5};
    fun(a,5);
}
void  fun(int a[],int n)
{
    int i;
    for(i=0;i<=n-1;i++)
        printf("value=%d\n",a[i]);
}

С помощью этого метода мы можем передать массив по значению, но на самом деле массив получает доступ через свой базовый адрес, который фактически копируется в стек.

...