포인터로서의 배열 이름
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 7번째.
C 언어에서 배열과 포인터는 특별한 관계를 가지고 있으며, 이는 C가 메모리에서 데이터를 처리하는 방식을 이해하는 데 필수적입니다. 배열을 선언할 때, 배열 이름 그 자체가 배열의 첫 번째 요소를 가리키는 상수 포인터처럼 동작합니다.
이는 int numbers[5];와 같은 배열이 있을 때, numbers라는 이름이 본질적으로 항상 numbers[0]를 가리키는 포인터라는 것을 의미합니다. 배열 이름을 별도로 선언할 필요가 없는 내장 포인터라고 생각할 수 있습니다.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers'는 첫 번째 요소를 가리킵니다
// numbers == &numbers[0] // 이들은 동일합니다!이러한 동등성은 매우 중요합니다: numbers와 &numbers[0]은 둘 다 정확히 동일한 메모리 주소를 제공합니다. 배열 이름은 주소 연산자(address-of operator)를 사용할 필요 없이 첫 번째 요소의 주소를 참조하는 더 편리한 방법일 뿐입니다.
이러한 관계를 이해하면 배열과 함께 포인터 기술을 사용할 수 있는 길이 열리며, 이는 코드를 더욱 유연하고 효율적으로 만들 수 있습니다. 주요 차이점은 일반 포인터와 달리 배열 이름은 상수 포인터(constant pointers)라는 점입니다. 즉, 배열 이름이 가리키는 대상을 변경할 수 없습니다.
챌린지
쉬움배열 이름과 첫 번째 요소를 가리키는 포인터 사이의 동등성을 증명하는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 4개의 요소를 가진
numbers라는 이름의 정수 배열을 선언하고 {10, 20, 30, 40} 값으로 초기화합니다. ptr이라는 이름의 정수 포인터를 선언합니다.- 배열 이름
numbers를 포인터ptr에 할당합니다. printf와%p형식 지정자를 사용하여numbers에 저장된 주소를 출력합니다.printf와%p형식 지정자를 사용하여 첫 번째 요소의 주소&numbers[0]를 출력합니다.printf와%p형식 지정자를 사용하여ptr에 저장된 주소를 출력합니다.- 배열 이름을 사용하여 첫 번째 요소의 값을 출력합니다:
*numbers - 포인터를 사용하여 첫 번째 요소의 값을 출력합니다:
*ptr
출력 결과는 다음과 같은 형식으로 표시되어야 합니다:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10이 챌린지는 배열 이름이 첫 번째 요소를 가리키는 상수 포인터 역할을 하며, ptr에 배열 이름이 할당되었을 때 numbers, &numbers[0], 그리고 ptr이 모두 동일한 메모리 주소를 포함한다는 것을 보여줍니다.
치트 시트
C 언어에서 배열 이름은 배열의 첫 번째 요소를 가리키는 상수 포인터처럼 동작합니다.
배열을 선언하면, 배열 이름은 첫 번째 요소를 가리킵니다:
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers'는 첫 번째 요소를 가리킵니다
// numbers == &numbers[0] // 이들은 동일합니다!배열 이름을 포인터에 할당할 수 있습니다:
int *ptr;
ptr = numbers; // ptr은 이제 첫 번째 요소를 가리킵니다포인터 표기법을 사용하여 값에 접근하기:
*numbers // 배열 이름을 통한 첫 번째 요소의 값
*ptr // 포인터를 통한 첫 번째 요소의 값주요 차이점: 배열 이름은 상수 포인터입니다. 일반 포인터와 달리 가리키는 대상을 변경할 수 없습니다.
직접 해보기
#include <stdio.h>
int main() {
// TODO: 여기에 코드를 작성하세요
// 1. {10, 20, 30, 40}으로 'numbers' 배열을 선언하고 초기화합니다
// 2. 'ptr'이라는 이름의 정수형 포인터를 선언합니다
// 3. 배열 이름을 포인터에 할당합니다
// 4. 필요한 모든 주소와 값을 출력합니다
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.