Передача массива функции по значению
Ниже приведен фрагмент из книги C Программирование Просто ответы на часто задаваемые вопросы. Разве это не так, поскольку массивы никогда не могут быть переданы по ссылке?
VIII.6: Как вы можете передать массив функции по значению?
Ответ: Массив может быть передан функции по значению, объявив в вызываемая функция - имя массива с квадратными скобками ([
и ]
) прилагается к концу. При вызове функции, просто передайте адрес массив (то есть имя массива) к вызываемой функции. Например, следующая программа передает массив x[]
к функции, названной byval_func()
по значению:
Параметр int[]
указывает компилятор, что byval_func()
функция будет принимать один аргумент - массив целых чисел. Когда Вызывается функция byval_func()
, вы передать адрес массива в byval_func()
:
byval_func(x);
Поскольку массив передается значение, точная копия массива сделанные и помещенные в стек. вызываемая функция затем получает это копию массива и печать. Поскольку массив передан byval_func()
- это копия исходный массив, изменяющий массив в функции byval_func()
имеет не влияет на исходный массив.
Ответы
Ответ 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]);
}
С помощью этого метода мы можем передать массив по значению, но на самом деле массив обращается через его базовый адрес, который фактически копирует в стек.