의 당신의 예를 통해 가자 :
void showInt(int* numbers) // (1)
{
numbers += 3; // (2)
}
int main()
{
int* a = 10; // (3)
showInt(a); // (4)
return 0;
}
(1) numbers
변수가이 함수에 전달 된 변수의 복사본입니다;
(2) (1) numbers
의 모든 변경 사항은이 함수 내에서만 유지됩니다. 이 함수에 전달 된 원래 변수의 값은 동일하게 유지됩니다! 그러나 다음 사항에 유의하십시오. 포인터 (a
)의 값을 함수로 전달할 수는 없지만 해당 포인터의 복사본 (numbers
)을 통해 포인터가 가리키는 값을 변경할 수 있습니다! 그건 주요 트릭입니다. 일단 함수 안에 주소가 있으면, 그 주소에 쓸 수 있고, 함수가 반환 된 후에도 그 변화가 남아 있습니다. 주소에 쓰는 것은 포인터 역 참조를 포함하지만 운 좋게도 그렇게하지 않았습니다 - 전달한 주소가 메모리의 임의의 주소 (10)이기 때문에 운이 좋게 말합니다. 주소 10에 글을 쓰려고하면 프로그램이 중단 될 가능성이 있습니다.
(3) a
이 "int to pointer"유형이라고 선언 했으므로 value는 일부 int
개체의 주소로되어 있습니다. 10이 일부 int의 유효한 주소라고 가정 할 때 당신은 여기에서 위험한 실수를 범했지만 그 주소에 무엇이 있는지 실제로 알지 못합니다.
(4) 변수 a
사본을 함수에 전달 중입니다. 함수는 해당 값을 numbers
변수에 저장하고 값을 증가시킵니다. 따라서 numbers
에는 13 번 주소가 포함됩니다 (값이 13 인 일부 정수 변수의 주소가 아님).
이
void showInt(int* numbers)
{
*numbers += 3; // (1)
}
int main()
{
int a = 10; // (2)
showInt(&a); // (3)
return 0;
}
(1) 함수는 numbers
에 보관 주소 값을 수정 : 10
당신은 아마 이런 식으로 뭔가를 원 a
하지만 동일하게 유지하며 여전히 같은 값을가집니다. 포인터가 역 참조됩니다.
(2) 무작위로 선택한 주소 (예 : 10)뿐만 아니라 int 변수의 유효한 주소가 필요합니다. 따라서 int 변수 인 a
을 선언합니다. 주소는 &a
입니다.
(3)의 어드레스 a
변수 numbers
통해 showInt
에 전달되며 지금 함수 (int 객체 현재 유효한 주소는 - a
) 해당 주소에 기록 할 수 a
의 값을 수정하도록. 함수가 돌아 오면 a
의 값은 13입니다. a
의 주소는 여기에서 언제든지 변경되지 않습니다.
함수의 이름이 필요합니다. –
@TommyA 예, 죄송합니다. 알아 차 렸습니다. P – Danny
'int * a = 10;이 무엇이든간에, 그렇게하지 않습니다. –