Как работает вызов по значению и вызов по ссылке в C?

В программе на C, как работает вызов функции по значению, как работает вызов по ссылке и как вы возвращаете значение?

 Carl Norum02 нояб. 2009 г., 04:28
Лучше очисти этот вопрос, чтобы мы могли его понять ...

Ответы на вопрос(3)

Что вы можете сделать, это передать указатель (который работает как ссылка, но отличается от того, что C ++ называет "ссылка") к данным, которые интересуют вашу функцию, что позволяет вам делать большинство вещей, для которых полезен вызов по ссылке.

 sjsam18 февр. 2016 г., 03:10
@DanielPryden: Спасибо.
 sjsam17 февр. 2016 г., 13:09
@DanielPryden: не могли бы вы объяснить термин «переплет»?
 caf02 нояб. 2009 г., 04:56
Стандарт языка C говорит, что значение указателя "предоставляет ссылку на сущность ссылочного типа " - термин С ++ "ссылка" намного более узкий, чем более широкий смысл CS.
 Daniel Pryden18 февр. 2016 г., 00:06
@sjsam: в данном случае это означает изменениепеременная а не толькозначение прошло. Увидетьэтот другой мой ответ что объясняет это гораздо более тщательно.
 Daniel Pryden02 нояб. 2009 г., 05:06
@caf: Вы совершенно правы в обоих своих утверждениях. Дополнительно "звоните по ссылке» это другая вещь со значением, которое больше похоже на C ++ссылки, чем общийссылка" Понятие языка Си. Вызов по ссылке вводит специфические семантические возможности, прежде всего то, что вызываемые могут перепривязывать переменные в вызывающемс контекстом. Передача указателяне то же самое, так как вызываемый может изменить объект, на который указывает указатель, но не может повторно связать вызывающегоУказатель указывает на что-то еще.

что если вы хотите изменить указатель, вы должны передать сам указатель по ссылке.

В этом примереp изменяется только в стеке (в области действия функции) и получит старое значение при выходе из функции:

void do_nothing(char *p)
{
    p = (char *)malloc(100);
}

Чтобы изменить указатель, вы должны передать его по ссылке:

void my_string(char **p)
{
    *p = (char *)malloc(100);
}

и вызов:

char *str = NULL;
my_string(&str);
...
free(str);
 Daniel Pryden03 нояб. 2009 г., 17:31
Это является следствием того факта, что передача указателя не совпадает с вызовом по ссылке. Следовательно, чтобы передать изменяемый указатель, вам нужно передать указатель (по значению) на указатель, который ссылается на ваши данные. Фактический аргумент по-прежнему всегда передается по значению.
Решение Вопроса

Звонок по значению

void foo(int c){
    c=5; //5 is assigned to a copy of c
}

Назовите это так:

int c=4;
foo(c);
//c is still 4 here.

Вызов по ссылке: передать указатель. Ссылки существуют в C ++

void foo(int* c){
    *c=5; //5 is assigned to  c
}

Назовите это так:

int c=0;
foo(&c);
//c is 5 here.

Возвращаемое значение

int foo(){
    int c=4;
     return c;//A copy of C is returned
}

Вернуться через аргументы

   int foo(int* errcode){

       *errcode = OK;

        return some_calculation
   }

Ваш ответ на вопрос