C 언어에서 배열에 접근하는 방법에는 여러 가지가 있습니다. 배열은 메모리에서 연속적으로 저장되며, 인덱스를 사용하여 각 요소에 접근할 수 있습니다. 배열을 다루는 다양한 접근 방법을 아래에 자세히 설명하겠습니다.
1. 배열 인덱스를 통한 접근
배열의 각 요소는 인덱스를 사용하여 접근할 수 있습니다. 배열의 인덱스는 0부터 시작합니다.
c
코드 복사
#include <stdio.h> int main() { int arr[5] = {10, 20, 30, 40, 50}; // 배열 요소에 인덱스를 통해 접근 printf("첫 번째 요소: %d\n", arr[0]); // 출력: 10 printf("세 번째 요소: %d\n", arr[2]); // 출력: 30 return 0; }
2. 포인터를 통한 접근
배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 사용됩니다. 포인터 연산을 사용하여 배열의 요소에 접근할 수 있습니다.
포인터를 사용한 배열 접근
c
코드 복사
#include <stdio.h> int main() { int arr[5] = {10, 20, 30, 40, 50}; int *ptr = arr; // 배열의 첫 번째 요소를 가리키는 포인터 // 포인터 연산을 통해 배열 요소 접근 printf("첫 번째 요소: %d\n", *ptr); // 출력: 10 printf("세 번째 요소: %d\n", *(ptr + 2)); // 출력: 30 return 0; }
3. 배열의 포인터를 사용한 접근
배열의 포인터를 사용하여 다차원 배열에 접근할 수 있습니다. 포인터와 포인터 연산을 사용하면 다차원 배열의 요소에 접근할 수 있습니다.
2차원 배열 접근
c
코드 복사
#include <stdio.h> int main() { int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} }; // 배열 이름을 포인터처럼 사용하여 접근 int (*ptr)[3] = matrix; // 포인터를 사용하여 2차원 배열 접근 printf("matrix[0][0] = %d\n", *(*(ptr + 0) + 0)); // 출력: 1 printf("matrix[1][2] = %d\n", *(*(ptr + 1) + 2)); // 출력: 6 return 0; }
4. 배열의 이름을 포인터처럼 사용
배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 취급됩니다. 따라서 배열의 이름을 포인터처럼 사용할 수 있습니다.
배열의 이름을 포인터처럼 사용하기
c
코드 복사
#include <stdio.h> int main() { int arr[4] = {10, 20, 30, 40}; // 배열의 이름을 포인터처럼 사용하여 배열 요소에 접근 for (int i = 0; i < 4; i++) { printf("arr[%d] = %d\n", i, *(arr + i)); // arr[i]와 동일 } return 0; }
5. 다차원 배열의 포인터 연산
다차원 배열은 배열의 배열로 구성되어 있으며, 포인터 연산을 통해 접근할 수 있습니다. 다차원 배열의 요소는 포인터 연산을 통해 접근할 수 있습니다.
다차원 배열의 포인터 연산
c
코드 복사
#include <stdio.h> int main() { int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} }; // 2차원 배열의 포인터 연산 int (*ptr)[3] = matrix; // 2차원 배열을 가리키는 포인터 // 포인터 연산을 통해 2차원 배열의 요소에 접근 printf("matrix[0][1] = %d\n", *(*(ptr + 0) + 1)); // 출력: 2 printf("matrix[1][0] = %d\n", *(*(ptr + 1) + 0)); // 출력: 4 return 0; }
6. 배열과 포인터의 차이
배열과 포인터는 서로 밀접하게 관련되어 있지만, 몇 가지 중요한 차이점이 있습니다:
- 배열: 배열은 메모리에서 연속적으로 저장된 데이터 블록입니다. 배열의 크기는 선언 시에 정해지며, 배열의 이름은 배열의 첫 번째 요소의 주소를 가리키는 상수 포인터입니다.
- 포인터: 포인터는 변수의 메모리 주소를 저장합니다. 포인터는 동적으로 메모리를 할당받거나 다른 변수의 주소를 가리킬 수 있습니다. 포인터 연산을 통해 메모리 주소를 조작할 수 있습니다.
예제: 배열과 포인터의 차이
c
코드 복사
#include <stdio.h> int main() { int arr[3] = {1, 2, 3}; int *ptr = arr; // 배열의 첫 번째 요소를 가리키는 포인터 // 배열 이름과 포인터를 사용한 접근 printf("arr[1] = %d\n", arr[1]); // 출력: 2 printf("*(ptr + 1) = %d\n", *(ptr + 1)); // 출력: 2 // 배열의 주소와 포인터의 주소 차이 printf("배열 이름의 주소: %p\n", (void *)arr); printf("포인터의 주소: %p\n", (void *)ptr); return 0; }