Передача переменной в функцию с & в заголовке - PullRequest
1 голос
/ 25 января 2012

Я делаю процедуру, и она работает, но я не уверен, будет ли она работать во всех случаях, так как она не обычная.

void func (int &num){
    num=blah;
}

int main() {
    int num;
    func(num);
}

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

void func (int* num){
    *num=blah;
}

int main() {
    int num;
    func(&num);
}

На самом деле есть и более сложная версия:

void func(float* &list){
    list=new float[3];
}

int main() {
    float *list;
    func(list);
}

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

void func(float** list){
    *list=new float[3];
}

int main(){
    float *list;
    func(&list);
}

Ваша помощь очень ценится, поскольку я в полном замешательстве.

Ответы [ 3 ]

1 голос
/ 25 января 2012

Синтаксис с int & - не C, а C ++.Это так называемая ссылка.Если ваш компилятор C ( not C ++) принимает это, то это нестандартное расширение (для компилятора C ++ это, конечно, часть языка).

Основная механикассылка заключается в том, что оно действует как имя (или другое имя) для существующего объекта.Например:

int a;
int& b = a;
b = 3; /* equivalent to a = 3 */

Один из способов восприятия ссылки - это указатель с автоматической разыменовкой (он также обычно применяется).То есть приведенный выше код эквивалентен

int a;
int* pb = &a;
*pb = 3;
1 голос
/ 25 января 2012

Ваш первый пример верен - вы передаете int по ссылке func().

Ваш второй пример также хорош (теперь, когда вы его отредактировали). В этом случае вы передаете int * по значению func().

Ваш третий и четвертый примеры также верны. В третьем вы передаете float * по ссылке. Во втором случае вы передаете float ** по значению (что семантически похоже на передачу float * по ссылке, что может быть причиной того, что вы их путаете).

В вашем примере кода нет ничего "обычного" или "нетрадиционного". Все это на 100% правильно и будет работать нормально. Хотя между передачей указателей по значению и передачей по ссылкам есть некоторые тонкие семантические различия, эти примеры хороши.

0 голосов
/ 25 января 2012

Форма Func(int &x) является формой передачи c ++ по ссылке c, которая не поддерживает это.Это логическая двусмысленность передачи указателем.Компонент неявно берет адрес для вас в вызове.

В C вы всегда объявляете

Func(int *x)
{ ... } 

и называете его

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