합니까 : 둘째
는 다음과 같이 할 수
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
}
!
1. 포인터 복사본 만 변경했습니다 (이 문제를 해결하려면 참조로 전달하십시오). 2. 함수 호출이 반환 될 때 포인터가 더 이상 유효하지 않으므로이 함수가 작동하지 않으면 기본적으로 정의되지 않은 동작을합니다. –
함수를 종료 할 때'x'가 삭제되므로 함수 외부의 주소를 사용하면 정의되지 않은 동작이 발생합니다. – SurvivalMachine
역 참조 연산자'*'에 대해 배웁니다. –