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

태그:

카테고리:

업데이트:

댓글남기기