C언어에서 포인터는 변수의 메모리 주소를 저장하는 변수이다. 배열과 포인터는 밀접하게 관련되어 있으며, 이 둘을 연결지어 이해하면 C언어의 메모리 관리에 대한 깊은 이해를 얻을 수 있다. 이번에는 배열과 포인터의 관계에 대해 설명한다.
⭐1. 배열과 포인터의 관계
C언어에서 배열 이름은 배열의 첫 번째 요소를 가리키는 포인터로 사용될 수 있다. 예를 들어, int numbers[5]; 배열이 있다면, numbers는 &numbers[0]와 같은 주소를 가지고 있다. 이것은 배열의 이름이 첫 번째 요소의 주소를 가리키는 포인터로 동작한다는 것을 의미한다.
int numbers[5] = {10, 20, 30, 40, 50};
int *p = numbers; // 또는 &numbers[0]
printf("%d\n", *p); // 10 출력
⭐2. 포인터를 사용한 배열 접근
비록 배열 이름이 첫 번째 요소를 가리키는 포인터처럼 동작하지만, 배열과 포인터는 몇 가지 중요한 차이점이 있다.
2.1. 타입과 크기: 배열 이름은 배열의 타입과 크기 정보를 내포하고 있다. 반면에 포인터는 단지 주소를 저장하며, 가리키는 변수의 타입만 알고 있다.
2.2. 변경 가능성: 배열 이름은 상수 포인터처럼 동작하여, 그 값을 다른 주소로 변경할 수 없다. 반면에 포인터 변수의 값은 변경할 수 있어서, 다른 주소를 가리키게 할 수 있다.
⭐3. 포인터와 배열의 사용
포인터를 사용하면 함수에서 배열을 효율적으로 다룰 수 있다. 함수에 배열을 인자로 전달할 때, 배열의 크기 정보는 전달되지 않는다. 하지만 포인터를 사용하면 배열의 특정 요소에 접근하거나 배열을 순회할 수 있다.
void printArray(int *array, int size) {
for(int i = 0; i < size; i++) {
printf("%d ", *(array + i));
}
printf("\n");
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
printArray(numbers, 5);
return 0;
}
C언어에서 배열과 포인터의 관계는 깊으며, 이 둘을 이해하는 것은 메모리 접근과 조작에 있어서 중요하다. 배열 이름이 포인터처럼 동작한다는 점과 포인터 연산을 통해 배열 요소에 접근할 수 있다는 점은 특히 유용하다. 하지만, 배열과 포인터가 완전히 같지는 않으며, 이들 사이의 차이점을 이해하는 것도 중요하다.
'C언어 30강' 카테고리의 다른 글
[C/C++ Tip] 10. Call by Value vs Call by Reference (0) | 2024.09.14 |
---|---|
[C/C++ Tip] 9. memset, memcpy (0) | 2024.09.08 |
[C/C++ Tip] 7. 배열의 기초 (1) | 2024.09.04 |
[C/C++ Tip] 6. UNION 공용체와 STRUCT 구조체로 패킷 만들기 (2) | 2024.09.04 |
[C/C++ Tip] 5. 구조체 패딩의 필요성 (0) | 2024.09.04 |