Передача массива в функцию по значению или ссылка одинаковая? - PullRequest
0 голосов
/ 16 мая 2018

Я хочу знать, есть ли какая-то реальная разница; Я написал код, который, по его мнению, является передачей по копии, а не ссылкой, но он действует как ссылка.

Вот код:

#include <stdio.h>
#include <conio.h>
using namespace std;
int pause = 0;

void display(int b[5], int size){
    for (int i = 0; i < size; i++){
        printf("\n%d",b[i]," at:");
        printf(" %d", &b[i]);
    }
}

void main(){

    int num[] = { 2, 4, 6, 8, 10 };
    printf("\nIn main function.");
    for (int i = 0; i < 5; i++){
        printf("\n%d", num[i], " at:");
        printf(" %d", &num[i]);
    }
    display(num,5);

    scanf("%d", pause);
}

1 Ответ

0 голосов
/ 16 мая 2018

Вы не можете передать сам массив функции вообще , а также не можете его вернуть.В частности, несмотря на появление своего объявления, ваша функция display() не получает массив в качестве параметра.Это объявление на 100% эквивалентно этому:

void display(int *b, int size);

, а вот этому:

void display(int b[], int size);

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

display(num,5);

эквивалентен

display(&num[0],5);

Тем не менее, существует потенциальная разница для вызова в этой области: выражение &num равно не эквивалентно &num[0].Они ссылаются на один и тот же адрес, но два выражения имеют разные типы.Передача первого будет аналогом передачи массива по ссылке, но это выражение не имеет правильного типа для первого аргумента вашей функции display().Функция, которая хочет получить & num, должна быть объявлена ​​по-другому:

void display2(int (*b)[5]);

или

void display3(int n, int (*b)[n]);

Для последнего требуется C99 или C2011 с поддержкой VLA (что требуется в C99, нонеобязательно в C2011).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...