이 두 코드 사이에 약간 혼란스러워합니다.
버전 1 : (컴파일 후 경고 표시)
int func(int *ptr2)
{
*ptr2 += 1;
}
int main()
{
int a = 5;
int *ptr = &a;
printf("Address of a: %x\n", a);
printf("Before: %x\n", ptr);
func(&ptr);
printf("After: %x\n", ptr);
return 0;
}
산출:
Address of a: 5770a18c
Before: 5770a18c
After: 5770a18d
버전 2 :
int func(int **ptr2)
{
*ptr2 += 1;
}
int main()
{
int a = 5;
int *ptr = &a;
printf("address of a: %x\n", &a);
printf("Before: %x\n", ptr);
func(&ptr);
printf("After: %x\n", ptr);
return 0;
}
산출:
Address of a: cc29385c
Before: cc29385c
After: cc293860
참조로 전달할 때 C의 포인터를 올바르게 이해하고 있다면 해당 위치에 대한 포인터를 만드는 것입니다. 이를 통해 역 참조 연산자를 통해 포인터가 보유한 주소의 값을 변경할 수 있습니다.
그러나 포인터가 보유한 값을 변경하려면 포인터에 대한 포인터를 사용합니다. 포인터의 주소를 전달하고 해당 주소를 보유 할 새 포인터를 만듭니다. 값을 변경하려면 역 참조 연산자를 사용하여 포인터의 (다른 곳에 정의 된) 값에 액세스합니다.
바라건대 나는 올바른 길을 가고 있지만 버전 1에서 일어나는 일을 구체적으로 시각화하는 데 어려움을 겪고 있습니다. 주로이 두 프로그램의 구성과 출력의 차이를 이해하고 싶습니다. 버전 1이 여전히 포인터에 대한 포인터라고 가정하지만 두 프로그램간에 증가 된 값이 다른 이유는 무엇입니까? 버전 1이 ptr의 값을 성공적으로 증가시키는 경우 (내가 의심하는) 동일한 구문의 코드를 찾을 수없는 이유는 무엇입니까? 나는 여기에 상당히 사소한 것을 놓치고 있다고 생각합니다 ... 어떤 도움이라도 감사합니다
출력에 따라 주소 int
가 해당 크기 인 32 비트 시스템 용으로 컴파일하는 것으로 보입니다 .
*ptr
해당 유형이 int
인 값을 증가 시키면 단순히 1을 더합니다.
때 *ptr
로 확인이 int*
다음에 의해 증가됩니다 sizeof(int)
우리는 바이트의 숫자로 주소를 증가시켜야하므로이 경우에는 현재 주소의 값이 4 바이트이기 때문 있음을 int
소비하는 다음 INT에서 우린 가리키는 있도록. 이 작업은 실제로 후속 주소에 메모리를 할당 한 경우에만 유효합니다.
일반적으로 T**
수신자가 가리키는 주소를 수정해야 할 때 a를 전달합니다. 예를 들어 수신자 malloc()
가 포인터에 대한 공간을 할당하기 위해 a 를 수행합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다