почему результаты этих двух функций разные? - PullRequest
0 голосов
/ 04 декабря 2018

Я ожидал, что результаты такие же.Две функции делают одно и то же, но
почему они разные?
Я думаю, это связано с указателями.

void changer(int n){
    n = 20;
}

void arrayChanger(int n[]){
    n[0] = 20;
}

int main()
{
    int a = 5;
    int ar[1] = {5};

    changer(a);
    arrayChanger(ar);

    printf("%d\n",a);
    printf("%d\n",ar[0]);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В changer(a) вы передаете int как параметр.Этот int передается по значению.Это означает, что когда changer выполняется, он просто принимает int 5 в качестве параметра и устанавливает параметр в 20. Однако, поскольку параметр передается по значению, параметр вне функции не изменяется.

В arrayChanger(ar) вы передаете массив в качестве параметра.Как упоминал Осирис, при передаче массива в функцию он «распадается» на указатель на первый элемент указанного массива.Поэтому в arrayChanger вы устанавливаете значение для указателя равным 20. Это означает, что после выполнения значение в указателе (которое осталось постоянным) теперь равно 20, а не исходному 5.

0 голосов
/ 04 декабря 2018

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

Функция changer не обновляет фактическую переменную a, поскольку она получает только свое значение, а не саму переменную.

Если вы хотите обновить значение в вызове функции, вам нужнопередать его по ссылке:

void make20(int *a) 
{
    *a = 20;
}

Тогда вызов будет выглядеть так:

int n = 5;
make20(&n);
// now n = 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...