2013-07-27 2 views
1

두 변수 (반환 값과 다른 값)를 변경하는 방법을 궁금해서 매개 변수 앞에 '&'이라는 함수를 호출했을 때 비틀 거 렸습니다. 매개 변수의 주소) 함수를 통해 '*'부호로 참조하십시오 ("역 참조"라고하며 주소의 객체를 변경 함).포인터와 C++ 함수 인수의 참조

어쨌든 괜찮 았는데, 친구는 변수가있는 함수를 직접 호출하고 머리글 앞에 &이라는 변수를 참조하고 함수 전체에서 정상적으로 처리 할 수 ​​있다고 말했습니다. 이 방법이 더 쉬워 보입니다. 그렇다면 왜 웹상에 더 많은 정보가 없습니까? 한 스타일이 다른 스타일보다 정확합니까?

void foo(int &junk) //The way the friend said 
{ 
    junk++; 
} 

void oof(int *junk) //what I found, and what the internet seems full of 
{ 
    (*junk)++; 
} 

int main() 
{ 
    int junk=1; 
    std::cout << junk << "\n"; 
    foo(junk); 
    std::cout << junk << "\n"; 
    oof(&junk); 
    std::cout << junk; 
} 

이 출력 :

1 
2 
3 

그래서 모든 것이 잘 작동

, 나는 가정 것입니다.

+2

및 매개 변수의 이름은 "참조 변수"를 만들어 사용. 고전적인 포인터 접근법 인'void oof (int * junk)'가 C에서 이와 같은 것을 할 수있는 유일한 방법입니다. 많은 사람들은 포인터를 변경하려고 할 때 포인터를 사용하는 것을 선호합니다. 변수를 수정하려고합니다. 참조 변수 접근법은 'void (const int & junk)'와 같은 const 매개 변수와 함께 사용되는데, 이는 인수가 수정되지 않는다는 것을 의미합니다. –

+0

OP는 [다중 반환 값] (http://stackoverflow.com/questions/7624779/returning-multiple-data-items-from-a-function-in-c-or-c)을 원한다고 표시했습니다. 현재 답변이나 제안 된 복제본에 언급되지 않았습니다. 이를 위해, ['std :: tuple'] (http://en.cppreference.com/w/cpp/utility/tuple)을 반환하고 평소와 같이 인수를 계속 받아들이는 것과 같은 것을 생각해보십시오. –

답변

1

첫 번째 접근 방식은 "포인터를 통한 전달"이라고합니다. 두 번째 방법은 "참조로 전달"이라고합니다. 첫 번째 경우에는 역 참조가 명시 적입니다. 두 번째 경우에는 참조가 암시 적입니다.

두 가지 방법의 가장 큰 차이점은 포인터로 전달할 때 "아무 것도"(즉, null 포인터)를 전달할 수 있다는 것입니다. 참조로 전달하면 아무런 참조도 합법적으로 전달할 수 없으며 일부 변수, 배열 요소, 클래스 또는 구조 필드 등을 참조해야합니다.

값을 반환하고 변수를 수정하면 참조로 전달하는 것이 더 적절합니다. 수정해야하는 변수가 항상 존재하기 때문입니다. 포인터로 전달하는 것은 포인터로 연결된 동적 데이터 구조를 트래버스 할 때 해당 데이터 구조의 일부가 존재할 수도 있고 존재하지 않을 수도 있습니다.

+0

이 (수락 된) 대답은 아래의 높은 대답의 반대입니다. 또한 나는 "쓰레기"가 "쓰레기"보다 더 암묵적이라고 주장 할 것이다. – so860

2

당신 첫 번째 함수 foo, 당신은 참조로 전달됩니다

변수가 우리가 그 가치의 사본을 전달하지 않는 참조에 의해 전달하지만, 우리가 어떻게 든 함수에 변수 자체를 전달하는

지역 변수에 대한 수정은 함수 호출에서 인수로 전달 된 상대 변수에 영향을 미칩니다. 참조로

전달의 예 :

Passing by reference

두 번째 예 oof에서, 당신은 변수에 포인터를 전달한다. https://stackoverflow.com/a/57492/1394283

하지만, 당신이 references를 사용해야하는 경우와 때 pointer을 사용해야합니다

둘 다 예 사이의 다른 알고 싶다면

, 나는 당신이 이것을 읽을 제안?

가능할 때마다 references이라고 말하고, 언제든지 pointers을 사용하십시오.

왜냐하면 포인터는 다른 구문보다 읽기/쓰기가 어렵고 안전하지 않으며 위험한 조작을 어렵게 만듭니다.

이 게시물이 아주 잘 설명 : https://stackoverflow.com/a/7058373/1394283