2013-08-05 2 views
2

Я использовал следующую программу для перекачки длины и шириной структуры прямоугольникаПередача указателя на член структуры к функции

typedef struct rectangle 
{ 
    int len; 
    int wid; 
} rect; 

void swap(int* a, int * b) 
{ 
    int temp; 
    temp= *a;  
    *a=*b; 
    *b=temp; 
} 

int main() 
{ 
    rect rect1; 
    rect *r1; 
    r1= &rect1; 
    r1->len=10; 
    r1->wid=5; 

    cout<< "area of rect " << r1->len * r1->wid<<endl; 
    swap(&r1->len,&r1->wid); 

    cout<< "length=" << rect1.len<<endl; 
    cout<<"width=" <<rect1.wid; 
} 

Однако, когда я использую следующий:

swap(r1->len,r1->wid); 

вместо:

swap(&r1->len,&r1->wid); 

Я до сих пор получаю правильные результаты, и я не знаю, как это работает. Для моего понимания я должен использовать (&r1->), чтобы передать адрес переменной-члена функции. Может кто-нибудь объяснить?

+1

Если вы опустили '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', оно даже не компилируется ... –

+0

Даже если он скомпилирован с множеством предупреждений, он должен привести к Сегментации fault.looking по адресу, который является целым значением. –

+0

Какой компилятор вы используете? Вы пишете C или C++? AFAIK «cout» не является командой ввода/вывода C – verbose

ответ

8

Вы - using namespace std;.

В стандартной библиотеке С ++ существует this version of the swap function, которая принимает два ссылки и проживает в std пространства имен.

Что происходит, когда вы используете &, ваша функция будет вызываться. Когда вы этого не сделаете, это тот, который поступает из стандартной библиотеки. Действительно, с помощью директивы using вам не нужно добавлять std:: перед именем функции. Поэтому в вашем случае ваша функция swap существует как перегрузка одной из стандартной библиотеки.

+3

Вот почему это плохая практика, чтобы использовать 'using namespace std'. –

+0

Да, я понял. даже после удаления моей функции swap() из программы, я получаю те же результаты. Итак, как указано вами, функция swap() из std lib вызывается здесь. Это решает мою проблему .. Большое спасибо за ваш ответ :) :) – user2652117

+0

спасибо за отличный ответ – kapil