포인터와 배열

이번강의가 중요한 이유는 메모리 동적할당을 받아서 배열처럼 사용하는데, 이때는 내부구조는 배열과 비슷하지만 배열과는 엄연히 다르다. 이는 포인터를 사용해서 메모리를 배열처럼 사용하는 것.

#define _CRT_SECURE_NO_WARNIGS
#include <stdio.h>

int main()
{
	int arr[10];
	const int num = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < num; ++i)
		arr[i] = (i + 1) * 100; // for문 이용한 배열 초기화

	int* ptr = arr; // 배열의 첫 주소 포인터변수 대입

	printf("%p %p %p\\n", ptr, arr, &arr[0]);

		ptr += 2; 

		printf("%p %p %p\\n", ptr, arr + 2, &arr[2]);
}

위의 예제를 실행시키면 ptr변수의 값과 arr의 값이 같은걸 알 수 있음. 이는 앞에서 계속 배운 것 처럼 배열의 변수이름은 메모리의 주소를 값으로 갖고 있기 때문임.

포인터와 배열변수명의 차이는, 포인터는 포인터 연산은 가능하지만 배열변수명은 연산이 안된다는 점.

arr += 2; // not working

주소뿐만 아니라 값에 있어서도 포인터와 배열은 비슷한 방식으로 사용 가능하다.

printf("%d %d %d\\n", *(ptr + 1), *(arr + 3), arr[3]);

위의 코드는 전부 같은 값을 출력한다.

중요한건 *을 붙일때 ()괄호로 묶어줘야 한다는 점임. Dereferencing할때 의미가 달라짐.

Untitled

이런 차이가 생겨버린다.

다음의 예를 보자.

int arr[10];
		const int num = sizeof(arr) / sizeof(arr[0]);
		int* ptr = NULL;
		ptr = arr;
		for (int i = 0; i < num; ++i)
		{
			arr[i] = (i + 1) * 100;
			printf("%d %d\\n", *ptr++, arr[i]);
		}

ptr변수를 선언해서 NULL로 초기화해주고,