해결된 질문
작성
·
29
1
함수 인자로 arr1 배열이 선언되어있는데, 이게 실제론 배열이 아닌 배열의 첫주소를 받고있으니까 arr1은 배열의 첫번째 주소가 대입된 포인터일텐데,
왜 포인터일텐데도 밑에서 arr1[i]와 같이 배열로도 쓸수있는건가요? 포인터를 배열로도 쓸수있는건가요?
답변 2
1
안녕하세요? 질문&답변 도우미 durams입니다.
[]
연산자(subscript operator)는 본질적으로 포인터 연산이기 때문에 당연히 포인터에도 사용이 가능합니다. 사실 배열에 []
연산자를 사용하는 것은 array-to-pointer decay(암시적으로 배열이 포인터로 변환됨을 의미함)를 거친 후 포인터 산술 연산을 통해 프로그래머가 지정한 인덱스의 원소에 접근하는 방식으로 동작합니다.
포인터를 배열로도 쓸 수 있는건가요? : 그렇지는 않습니다. 포인터는 단순히 주소값과 해당 주소에 있는 비트 패턴을 어떤 타입으로 해석할지에 해당하는 정보만 가집니다. 배열은 여기에 추가로 사이즈(크기) 정보를 갖습니다.
아래 코드의 printf
는 모두 동일하게 3
을 출력합니다.
int arr[5] = { 1, 2, 3, 4, 5 };
int* ptr = arr;
printf("%d\n", arr[2]);
printf("%d\n", ptr[2]);
printf("%d\n", *(arr + 2));
printf("%d\n", *(ptr + 2));
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
질문 주신 내용은 C 언어에서 배열과 포인터의 관계에 대한 부분으로 이해할 수 있습니다.
C 언어에서 함수의 매개변수로 배열을 전달할 때, 실제로 함수에서는 배열의 첫 번째 요소의 주소(포인터)를 받게 됩니다. 따라서 배열의 이름은 해당 배열의 첫 번째 요소의 주소를 나타내는 역할을 합니다.
그래서 arr1[i]
와 같은 표현이 가능하며, 이는 내부적으로 *(arr1 + i)
와 동일한 방식으로 작동합니다. 이런 이유로 포인터를 배열 인덱스 방법을 사용하여 접근할 수 있습니다. 이는 C 언어의 배열과 포인터 간의 밀접한 관계 때문입니다.
추가적으로, 아래의 URL을 통해 유사한 논의가 진행된 게시물을 참조할 수 있습니다:
- 질문: 포인터와 배열의 관계
이미지로 첨부된 코드가 관련된 내용을 포함하고 있으니 확인하시면서 실습하시면 더 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
포인터는 배열은 아니지만 []가 본질적으로 포인터 연산이기 때문에 포인터로 []연산이 가능하다는 걸까요?