포인터와 배열
이번강의가 중요한 이유는 메모리 동적할당을 받아서 배열처럼 사용하는데, 이때는 내부구조는 배열과 비슷하지만 배열과는 엄연히 다르다. 이는 포인터를 사용해서 메모리를 배열처럼 사용하는 것.
#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할때 의미가 달라짐.
이런 차이가 생겨버린다.
다음의 예를 보자.
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로 초기화해주고,