2014-11-08 5 views
-2
#include <iostream> 

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

int main() { 
    int alpha = 5; 
    int beta = 34; 

    swap (alpha,beta); 

    std::cout << alpha << std::endl; 
    std::cout << beta << std::endl; 

    int *ab = new int(); 
    *ab = 34; 
    int *cd = new int(); 
    *cd =64; 

    swap(ab,cd); 

    std::cout << *ab << std::endl; 
    std::cout << *cd << std::endl; 
} 

첫 번째 질문 : 전달 매개 변수로 포인터가있는 함수에 값을 전달할 수 있습니까?포인터를 함수에 전달 하시겠습니까?

두 번째 질문 : 어떻게 교환 할 수 있습니까? 그것은 포인터를 바꿉니다. 그러나 그것이 나왔을 때 알파와 베타의 가치가 여전히 동일하지 않아야합니다.

세 번째 질문 : 포인터를 전달할 때 함수가 작동하지 않는 이유는 무엇입니까? 일반 변수를 전달할 때 작동합니다.

네 번째 질문 : void swap(int *a, int* b)의 기능은 int *aint *b입니다.

+7

당신의'using namespace std;'가 당신을 망치고 있습니다. 표준 스왑 함수는 실제로 실제로 구현됩니다. 너는 그렇지 않아. – chris

+1

'swap (& alpha, &beta);' –

+0

@chris 사실 첫 번째 호출에서 우연히'std :: swap'을 사용합니다 :). – 101010

답변

1

먼저 스왑 기능이 잘못되었습니다. 나는 당신이 포인터가 아닌 포인터를 가리키는 객체를 바꾸고 싶다고 가정합니다. 이 함수는 파라미터 A 및 B에서이

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

으로 정의되어야하고,이

swap (&alpha, &beta); 

swap(ab, cd); 

같이 호출 할 수는 포인터. 당신은 매개 변수로 참조를 사용하려면 다음 함수는

void swap(int &a, int &b) 
{ 
    int tmp = a; 
    a = b; 
    b = tmp; 
} 

모양을하고

swap (alpha, beta); 

swap(*ab, *cd); 

당신이 separatly 포인터를 교체하려면

과 같이 호출 할 수 있습니다 포인터에 의해 가리키는 객체가 있다면 두 개의 오버로드 된 함수 나 표준 C++ 함수 인 하나의 템플릿 함수를 정의해야합니다. std::swap.

+0

int k를 사용하면 컴파일 오류가 발생합니다. int * k를 사용할 때 아무런 문제가 없습니다. –

+0

정수를 포인터에 할당 할 수 없습니다. – rightfold

+0

@ John. J. Adams 오타가있었습니다. 업데이트 된 게시물을 참조하십시오. –

4

그리고 우리가 글로벌 수준의 네임 스페이스 표준을 포함하지 않아야하는 이유에 대한 가장 좋은 예를 제공 할 ...

swap (alpha,beta); 

swap 자신보다는 std::swap을 부를 것이다.

세 번째 질문 : 포인터를 통과 할 때 함수 작업을하지 않습니다하지만 swap가 제대로 작성되지 않기 때문에 나는 일반 변수

을 통과 할 때 작동하는 이유. 그것은해야한다 :

void swap (int *a, int *b) { 
    // Preferably you should also check if pointers are not NULL. 
    int temp; 
    temp = *a; 
    *a = *b; 
    *b = temp; 
} 

네 번째 질문 : void swap(int *a, int* b)int *aint *b 참조가있는 함수에서?

참조의 구문은 다음과 같습니다

void swap (int& a, int& b); 

그래서 아니, 그들은하지 않습니다. 그들은 포인터입니다.

관련 문제