Путать между вызовом по ссылке и вызовом по значению в моем коде - PullRequest
0 голосов
/ 02 мая 2019

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

Я создал пустой массив в main с именем freq_array, и это передается в качестве аргумента при вызове функции частоты. Так как после вызова func пустой массив теперь будет содержать значения, это считается вызовом по ссылке? Я читал на других сайтах, что при вызове по ссылке используются указатели, поэтому я немного запутался. Спасибо.

 void frequency(int[]);    //prototype

 frequency(freq_array); //func call

 void frequency(int fr[arraysize]) //arraysize = 18
 {
       int n;

       for (n=0; n<10; n++)
       {
        fr[n]= 100 * (n + 1);   //goes from 100Hz - 1000Hz
       }

        for (n=10; n<18; n++)       //goes from 2000Hz - 9000Hz
       {
         fr[n]= 1000 * (n - 8); 
       }

     }

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Теоретически, C имеет только «проход по значению». Однако, когда вы используете массив в качестве параметра функции, он корректируется («распадается») в указатель на первый элемент.

Следовательно, void frequency(int fr[arraysize]) полностью эквивалентно void frequency(int* fr). Компилятор заменит первый последним «за чертой».

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

2 голосов
/ 02 мая 2019

Для аргументов, вы не можете передавать массивы только указатели. Когда компилятор увидит аргумент int fr[arraysize], он будет трактовать как int *fr.

Когда вы делаете звонок

frequency(freq_array);

массив распадается на указатель на его первый элемент. Вышеуказанный вызов равен

frequency(&freq_array[0]);

И у С вообще нет прохода по ссылке . Указатель будет передан по значению.

Однако с помощью указателей вы можете эмулировать передавать по ссылке. Например

void emulate_pass_by_reference(int *a)
{
    *a = 10;  // Use dereference to access the memory that the pointer a is pointing to
}

int main(void)
{
    int b = 5;

    printf("Before call: b = %d\n", b);  // Will print that b is 5

    emulate_pass_by_reference(&b);  // Pass a pointer to the variable b

    printf("After call: b = %d\n", b);  // Will print that b is 10
}

Теперь важно знать, что сам указатель (&b) будет передан по значению.

...