Подтвердить что ты не робот

Передача массива функции по значению

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

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

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

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

byval_func(x);

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Запишите эту книгу. Если вам нужен реальный C-FAQ, который не был написан программистом-новичком, используйте его: 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);

Ответ 3

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

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

Ответ 4

#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]);
}

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