2016-08-20 7 views
-2

를 함수에 전달 int로 :다음 코드를 (기본 C++를) 고려

#include <cstdio> 

void changeNum(int* n) { 
    int x = 6; 
    n = &x; 
} 

int main() { 
    int num = 5; 
    changeNum(&num); 
    printf("num = %d\n", num); 
} 

여전히 5 num을 왜? n = &x을 6일까요?

x은 기능을 종료 할 때 삭제 되나요?

+0

1. 포인터 복사본 만 변경했습니다 (이 문제를 해결하려면 참조로 전달하십시오). 2. 함수 호출이 반환 될 때 포인터가 더 이상 유효하지 않으므로이 함수가 작동하지 않으면 기본적으로 정의되지 않은 동작을합니다. –

+0

함수를 종료 할 때'x'가 삭제되므로 함수 외부의 주소를 사용하면 정의되지 않은 동작이 발생합니다. – SurvivalMachine

+0

역 참조 연산자'*'에 대해 배웁니다. –

답변

3

합니까 : 둘째

는 다음과 같이 할 수 void ChangeNum을 수정, NUM에 x의 값을 할당합니다 :

void changeNum(int &n) 
{ 
    int x = 6; 
    n = x; 
} 

을 그리고 같은 함수를 호출 함수를 종료 할 때 삭제 되나요?

예. x로컬 변수입니다. 함수 또는 블록 내에서 선언 된 변수는 지역 변수입니다. 해당 함수 또는 코드 블록 안에있는 문으로 만 사용할 수 있습니다.

즉, changeNum 함수가 끝나면 (스택에 할당 된) x 변수가 삭제됩니다.

왜 num이 여전히 5입니까? n = & x 6이 아니어야합니까?

은의 당신의 이상한 기능을 분석하자

void changeNum(int* n) { 
    int x = 6; 
    n = &x; 
} 

는 당신이 여기에서하고있다있는 지역 변수x의 주소를 포인터n를 작성하고 할당합니다.

다양한 의견이 잘못되었습니다. 정의되지 않은 동작 인 입니다. n 포인터가 생성되었으므로 (값에 의해 전달 된 이후 포인터가 값으로 전달됩니다!) 함수가 호출되고 함수가 끝날 때 포인터가 소멸됩니다.

실제로 함수는 아무것도하지 않습니다. 호출자가 제공 한 주소로 초기화 된 포인터를 만들고 다른 주소를 할당합니다.

changeNum(&num); 

그냥 말한다 : 는 "임시 포인터를 생성하는 기능 changeNum에 값을 전달합니다 (포인터를 값으로 노트 패스!)". 그래서 그것은 포인터의 복사본을 생성하고 함수에 의해 사용됩니다.

내가 원하는 것을 어떻게 얻을 수 있습니까?

당신의 코드가 당신의 경험이 부족하다는 것을 보여주기 때문에 더 공부하는 것이 좋습니다.

어쨌든 올바른 행동이 있어야한다 : n 가리키는 정수로 6를 할당

void changeNum(int* n) { 
    *n = 6 
} 

!

+0

우수합니다. 알아 냈습니다. 고맙습니다! – galah92

1

아니요, 예상대로 작동하지 않습니다.

& 연산자는 변수의 주소를 취합니다. 그래서 당신은 주소가 아닌 값을 할당하고 있습니다. 결과적으로 포인터는 다른 객체를 참조하는 의미 적 의미를 갖는 지역 변수 인 포인터를 무시합니다.

이 해결의 2 가지 방법이 있습니다 :

방법 1 역 참조 n을, 그래서 당신은 그것에 할당 할 수 있습니다.

*n = x; 

방법 2는 직관적으로 할당 할 수 기준을 적용하는 방법을 다시 작성 .

void changeNum(int &n) { 
    int x = 6; 
    n = x; 
} 
int main() { 
    int n = 5; 
    changeNum(n); 
} 
+0

'int & n'은 더 좋을 것이지만 그렇지 않으면 훌륭한 대답입니다. –

+0

@LightnessRacesinOrbit : 서식 설정에 신경 쓰지 않고 도구가 나를 위해이 작업을 수행해야합니다. 나는 단지'*'와 같은 장소에'&'를 갖는 것에 익숙하다. 단지'int * a, b; prenting을 위해 오른쪽에있게된다. – JVApen

+0

다시 한번! 왜 한 가지 중요한 사건이 중요하다고 생각합니까? 정렬을 결정하는 데 더 많은 중요한 이유가 _ 있고, IMO는 모두 왼쪽 정렬을 가리 킵니다. '*'와'&'를 오른쪽 정렬하면 언어를 처음 접하는 사람들에게 혼란을 줄 수 있으며, 너무 많은 _ 의문이 생길 수 있습니다! 좋은 코드는 어쨌든 한 줄에 여러 변수를 선언하지 않습니다. 또한'&'를 오른쪽 정렬했기 때문에'&'를 오른쪽 정렬하는 이유가 아닙니다. 왜냐하면 <같은 이유로 모든 규칙이 똑같이 적용되기 때문에'*'>를 오른쪽 정렬했기 때문입니다. –

0

우선, 변수 'X'는 void ChangeNum(*n) 내에 선언되고,이 (실행 함수를 종료 한 경우)의 범위를 벗어나면, X가 삭제 얻는다. X

changeNum(num);

관련 문제