-
C언어 고급포인터Visual Studio/C 기초 2012. 9. 13. 20:44
포인터에 대해 자세히 알아보겠습니다.
포인터 자체는 숫자 변수이므로 컴퓨터 메모리 내의 특정 주소에 저장되는데, 포인터에 대한 포인터 즉, 포인터 변수의 값이 다른포인터의 주소인 변수를 생성할 수도 있습니다.
int x = 10;
int *ptr = &x;
int **ptr_ptr = &ptr;
포인터의 포인터를 선언할 때는 간접 연산자를 두 번 붙여주면 됩니다. 또한 포인터의 포인터가 가리키는 변수를 참조할 때도 간접 연산자를 두 번 사용합니다.
**ptr_ptr = 12; // 변수 x에 10의 값을 할당합니다.
여기서 실수로 간접 연산자를 한 번 사용하면 에러가 납니다.
*ptr_ptr = 10; // ptr_ptr이 가리키는 ptr의 값이 10을 할당합니다.
ptr엔 10이란 값이 저장되어 어떤 값이 저장되어 있을지 모르는 주소 10을 ptr이 가리키게 됩니다. 이건 잘못된 겁니다.
포인터와 다차원 배열
전에도 잠깐 설명했다 넘어갔죠? 이번엔 자세하게 알고 넘어가겠습니다.
대괄호를 포함하지 않는 배열의 이름이 배열의 첫 번째 요소에 대한 포인터라는 사실은 아주 중요합니다. 결과적으로 특정 형태의 배열을 참조할 때에는 포인터식 표기 방법을 사용하는 것이 낫습니다. 하지만 지금까지의 얘기는 1차원 배열에만 해당되는 내용이었습니다.
다차원 배열은 각각의 차원에 대해 대괄호를 사용하여 선언되는건 아시는 내용일거라 압니다. 2차원 배열을 선언하고 관련된 포인터 값을 출력하는 예제를 보여드리겠습니다.
#include <stdio.h>
int array[2][4];
main(){
printf("array = %u\n", array);
printf("array[0] = %u\n", array[0]);
printf("array[0][0] = %u\n", &array[0][0]);}
컴파일 해보시면 컴퓨터마다 다르지만 세 값이 모두 동일하다는 것을 알 수 있습니다.
각 항목의 크기를 파이트 단위로 출력해보겠습니다.
#include <stdio.h>
int array[2][4];
main(){
printf("array = %u\n", sizeof(array)); // 전체 배열의 값 = 8칸 X 4 = 32
printf("array[0] = %u\n", sizeof(array[0])); // 한 열의 값 = 4 X 4 = 16
printf("array[0][0] = %u\n", sizeof(array[0][0])); // 0행 0열의 값 = 1 X 4 = 4}
int로 2바이트를 사용한다면 각각 16, 8, 2 값이 나옵니다. windows나 UNIX 상에서는 int가 4바이트이기 때문에 32, 16, 4가 나온 겁니다.
포인터 연산도 해보겠습니다.
#include <stdio.h>
int array[2][4];
main(){
printf("array의 값 = %u\n", array);
printf("(array+1)의 값 = %u\n", (array+1));
printf("array[1]의 주소값 = %u\n", &array[1]);}
값은 컴퓨터 마다 다르겠지만 개념은 같을 겁니다. 값을 1 증가시키면 16(32비트 운영체제에선 16이 증가합니다)이 증가하고 다음 배열(array[1])을 가리키게 됩니다.
여기서 array가 array[0]에 대한 포인터라는 것을 알 수 있고, array[0] 자체엔 array[0][0]에 대한 포인터 라는 것도 알 수 있습니다. 즉, array는 포인터에 대한 포인터 입니다.
printf("%d",array[0][0]);
printf("%d", *array[0]);
printf("%d", **array);
array[0]에 저장된 값을 출력하기 위해 위의 세 문장중 하나를 선택해서 입력하시면 됩니다.
'Visual Studio > C 기초' 카테고리의 다른 글
C언어 연결리스트 (linked list) (0) 2012.09.21 C언어 함수 기초 (2) 2012.09.14 C언어 switch (0) 2012.09.10 C언어 반복문제어 (break, continue, goto) (0) 2012.09.08 C언어 변수의 범위 (0) 2012.09.07