해결된 질문
작성
·
23
답변 2
0
역참조는 값이 맞습니다. 그런데 그 값이 주소인 경우에는 헷갈리게 됩니다.
어떤 메모리의 주소가 다른 포인터에게는 값입니다. ("값" 자체가 다른 변수의 주소)
단계별로 설명드려보겠습니다.
char **ptr_b = &ptr_a;
ptr_b의 타입은 char** (이중 포인터)
ptr_b에는 ptr_a의 주소가 담겨있습니다.
*ptr_b를 하면?
"*를 붙였으니 값을 가져옵니다" (맞는 말)
그런데 ptr_b가 char**이므로, *ptr_b의 타입은 char*입니다
char*는 포인터 타입이죠?
따라서 가져온 "값"이 곧 "주소"(포인터)인 것입니다.
즉, *ptr_b = ptr_a = str의 주소
*ptr_b + 1은?
*ptr_b로 값(=주소)을 가져왔고
그 주소에 +1을 해서 char 크기만큼 이동시킵니다.
*(*ptr_b + 1)은?
다시 *를 붙여서 그 주소에 있는 값을 최종적으로 가져옵니다.
*를 붙이면 값을 가져온다"는 설명 자체는 맞습니다.
다만, 포인터의 경우 그 "값" 자체가 "주소"입니다.
*ptr_b는 값을 가져오는데, ptr_b가 이중 포인터이므로 가져온 값이 char* 타입의 주소인 것입니다.
이것이 바로 이중 포인터의 개념입니다.
포인터를 가리키는 포인터이기 때문에, 한 번 역참조하면 여전히 포인터(주소)가 나오는 것이죠.
이렇게만 보면 어려울 수 있는데, 실제로 제가 설명하는 것처럼 네모칸 위아래를 그려서 메모리 주소와 값을 작성해서 따라가면 크게 어렵지 않게 이해하실 수 있을 겁니다.
0
안녕하세요, 인프런 AI 인턴입니다. 태0님.
이중 포인터와 관련된 질문에서 혼란스러움을 겪으셨군요. 포인터의 이해를 돕기 위해 설명을 드리겠습니다.
포인터의 기본 개념:
*ptr_b: 이 부분은 ptr_b가 가리키고 있는 메모리 주소의 값을 가져옵니다. 즉, ptr_b가 저장하고 있는 주소의 값을 가져오게 됩니다.(*ptr_b + 1): ptr_b가 가리키고 있는 배열의 첫 번째 요소에 접근한 후, 그 다음 요소의 주소로 이동하는 것을 의미합니다.포인터 연산:
*(*ptr_b + 1): 이는 최종적으로 두 번째 레벨의 포인터를 통해 해당 메모리 주소에 저장된 값을 가져오기 위한 전체 표현식입니다. 즉, ptr_b가 가리키고 있는 포인터가 포인트하는 위치에서 다음 요소의 값을 가져오라는 의미입니다.따라서, 이번 설명에서 *(*ptr_b + 1)이 주소를 가리키는 것이 아닌, 두 단계의 역참조를 통해 실제 저장된 값을 가져온 것임을 이해하셔야 합니다.
포인터와 메모리 주소 참조에 대해 더 많은 예시와 설명을 원하신다면, 다음 링크를 통해 관련 정보를 참조하세요:
저는 태0님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.