본문 바로가기

Programming Language/Do it! C언어

[Do it! C언어 입문] 15장. 배열과 포인터

15. 배열과 포인터

15-1 배열과 포인터 표기법

배열 표기법과 포인터 표기법의 관계 - 두 문법은 표기만 다를 뿐 문법 구조는 비슷하다.
*(data+1)의 의미는 data[1]과 같다.
배열 표기법의 한계 - 배열 표기법 대신 포인터 표기법을 사용하여,
형 변환 문법을 사용하여 원 자료형의 포인터 크기를 (char*형)로 줄일 수 있고,
이 포인터 크기로 배열의 1바이트 메모리 영역만 변경할 수 있다.

15-2 배열 시작 주소

배열의 경우 첫 요소인 data[0]의 시작 주소가 배열 전체의 시작 주소와 같기 때문에 포인터 지정할 때

char data[4];
char *p = &data[0];

/*위의 포인터는 아래와 같이 줄여 쓸 수 있다. */
char *p = &*(data + 0);
char *p = &*(data);
char *p = data;

하지만 배열은 포인터가 아니다. 배열의 이름은 변수처럼 보이지만 실제로는 상수화된 주소로 변경할 수 없다.

15-3 배열을 사용하는 포인터

포인터로 배열의 주소를 저장하여 사용 - 사실 컴파일러의 최적화 능력이 좋아져서 큰 의미는 없지만, 그래도 좋은 습관을 들이려면 자주 신경 쓰자.

15-4 배열과 포인터의 합체

쉽게 생각해서 포인터가 100개 필요한 경우 하나씩 나열하여 쓰는 것은 너무 불편하니, 배열로 선언해서 사용하자.
char *p[5]와 같은 형식으로 사용, 이는 char *(p[5])와 같은 의미로 생각하면 된다.
즉, 포인터가 5개 배열의 형태로 선언된 것
하지만, char (*p)[5]의 의미는 다르다. 여기서 p 변수는 배열이 아니라 포인터이고, 포인터 변수 p가 가리키는 대상의 크기가 char[5]에 의해 5바이트라는 의미가 된다.
복잡하게 생겼는데, 2차원 배열을 가리키는 용도로 사용한다.