2016-11-29 3 views
-6

В следующем примере кода:передавая адрес в с

typedef struct data{ 
    char ch; 
    int n; 
    int n2; 


    }DATA; 


void Func3(DATA d){ 
    int sum; 
    sum = d.ch + d.n; 
    d.ch = 'c'; 
    d.n = 0x77; 

} 


void Func4(DATA &d){ 
    int sum; 
    sum = d.ch + d.n; 
    d.ch = 'k'; 
    //d.n = 0x88; 
} 
int WINAPI WinMain(HINSTANCE hlnst, HINSTANCE hprev, 
     LPSTR lpCmd, int nShow) 
{ 
    DATA dt; 
    dt.ch = 'a'; 
    dt.n = 10; 
    dt.n2 = 20; 
Func3(dt); 
Func4(dt); 

return 0; 
} 

Are FUNC3() и Func4() то же самое? Обе функции передаются по ссылке? Есть ли разница между двумя функциями?

+3

'void Func2 (DATA & d) {' недействителен (стандартный) C - с чем вы это компилируете? – UnholySheep

+3

В C нет доступа по ссылке –

+3

C не имеет ссылок. Однако вы можете * эмулировать * его указателями. –

ответ

1

Вы компилируете это с помощью компилятора C++.DATA &d не синтаксически корректен в С.

Func В, компилятор по существу пишет DATA d = dt до тела функции вводится.

В Func2 что «назначение» не происходит. Компилятор C++ устанавливает d как ссылка на dt. Таким образом, изменения в d в Func2 отражаются в вызывающем абоненте с изменениями на dt.

В вашем конкретном случае, хотя оптимизирующий компилятор признает, что обе функции не являются операционными системами, и поэтому, вероятно, скомпилируют их.

0

В C нет ссылок '&' типа переменных, как в C++.

Вы должны передать адрес, чтобы получить тот же эффект. FUNC2() в С с «D», как проход по ссылке будет выглядеть как показано ниже:

void Func2(DATA *d){ 
int sum; 
sum = d->ch + d->n; 
} 
0

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

Рассмотрим следующий показательной программы

#include <stdio.h> 

void f(int *sum, int x, int y) 
{ 
    *sum = x + y; 
} 

void g(int sum, int x, int y) 
{ 
    sum = x + y; 
} 

int main(void) 
{ 
    int x = 1, y = 2; 
    int sum; 

    sum = 0; 

    printf("Before call of f sum = %d\n", sum); 

    f(&sum, x, y); 

    printf("After call of f sum = %d\n", sum); 

    sum = 0; 

    printf("Before call of g sum = %d\n", sum); 

    g(sum, x, y); 

    printf("After call of g sum = %d\n", sum); 
} 

Выход программы

Before call of f sum = 0 
After call of f sum = 3 
Before call of g sum = 0 
After call of g sum = 0 

Первая функция, функция f. принимает аргумент sum по ссылке, используя указатель на sum. Таким образом, после вызова функции была изменена переменная sum.

Вторая функция, функция g, принимает аргумент sum по значению, которое является функцией, связанной с копией аргумента. Таким образом, любые изменения копии не влияют на значение исходного аргумента.

В C++ помимо этого значения слов «передать по ссылке» в кадре C имеется дополнительное значение, потому что C++ вводит понятие ссылок, как специальный тип деклараторов, и соответственно определяет понятие ссылочного типа.

Таким образом, на C++ вы можете еще одну возможность передать значение по ссылке. Вы можете использовать ссылочный тип.Например, вы могли бы определить функцию, для приведенного выше примера следующим образом

void f(int &sum, int x, int y) 
{ 
    sum = x + y; 
} 

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

.

Смежные вопросы