[C] 1차원 배열과 포인터
▶ 배열과 포인터
- 배열은 포인터를 1씩 증가하면서 만들어진 연속적인 자료구조이다.
- 포인터 하나가 1씩 주소 증가를 하면서 다음 데이터를 가리키게 되고, 포인터가 가리키는 메모리에 접근하기 위해 접근하는 연산자가 인덱스이다.
- ⭐즉, 배열의 이름은 배열의 첫 번째 요소(시작 주소)를 가리키는 포인터로 사용된다.
- 아래 코드에서 배열의 이름 a는 배열의 시작 주소(&a[0])를 가리키는 포인터!
int a[5] = { 1,2,3,4,5 };
- 아래 코드에서 포인터 변수 p는 배열 a의 시작 주소를 가리킨다.
- 따라서 1과 2, 3과 4는 완전히 동일하다는 것을 알 수 있다.
- *을 붙여 역참조를 하는 것과, 인덱스를 붙여 역참조 하는 것은 동일!
int a[5];
int *p = &a;
*p = 10; // 1
p[0] = 10; // 2
*(p + 1) = 2; // 3
p[1] // 4
▶ 포인터의 증가와 감소
- 포인터는 1씩 증가한다고 해서 1byte씩 증가하지 않는다.
- 포인터는 중간 주소를 가리키는 건 의미가 없기 때문에 가리키는 포인터의 크기만큼 증가하거나 감소한다.
int *p; // p가 100번지라고 가정할 때,
p+1? => 104번지
double *p; // p가 100번지라고 가정할 때,
p+1? => 108번지
왜 배열은 a[0]부터 시작할까?
- 배열의 포인터에서 주소 증가를 하지 않았기 때문이다!
-
즉, a[0]은 (a+0)이 가리키는 메모리, a[1]은 (a+1)이 가리키는 메모리를 뜻한다.
- 따라서 아래와 같이 나타낼 수 있다.
*(a + 2) = a[2];
*(a + 4) = a[4];
▶ 배열 포인터의 출력
- 배열은 포인터로 만들어진 자료 구조이므로, 배열을 받을 수 있는 방법은 포인터 밖에 없다.
- 포인터를 사용하여 배열을 출력해보자!
#include <stdio.h>
void fun(int* ptr) {
int i;
for (i = 0; i < 5; i++) {
printf("%d", ptr[i]);
}
}
int main()
{
int arr[5] = {5, 6, 7, 8, 9};
fun(arr);
}
- 짜잔!
📎참조
- https://www.youtube.com/watch?v=8I3ORaa0STo&list=PLrj92cHmwIMeGEv1EgvJdIJwQAFzHV3k1&index=3
댓글남기기