이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
C언어에서 많은 분들이 포인터에서 장벽을 느끼곤 합니다. 필자도 마찬가지이므로 포인터를 내 것으로 만들기 위해 '난 정말 C PROGRAMMING을 공부한 적이 없다구요!' 책을 참고하여 글을 쓰도록 하겠습니다.
포인터란?
포인터에 대해 물으면 대부분 '주소 값을 담고 있는 변수'라고 알고 있을 것 입니다. 일단은 90점인 답 입니다. 이유는 하단부에서 설명하도록 하겠습니다.
메모리의 주소체계
질문 1 '주소 값 하나가 가리키는 메모리 공간의 크기는?'
예를 들어 0xff2314 과 같은 주소 값이 가리키는 메모리 공간의 크기는 얼마냐를 물어보는 것 입니다. 이것은 생각할 것도 없이 약속이므로 1 바이트 크기의 주소 공간을 가집니다.
질문 2 '주소 값을 표현하는데 필요한 바이트 수는?'
예를 들어 0xff2314 과 같은 주소 값을 변수에 저장한다면, 몇 바이트의 변수에 저장해야 될 까요? 값이 작으면 1 바이트, 크면 4 바이트 이런 식으로 매번 계산할 수는 없으므로 하나로 정해야합니다. 그렇다면 어떻게 정해야하는가? 정답을 먼저 말하자면 운영체제가 몇 비트로 주소 값을 표현하는 가로 알 수 있습니다. 우리가 알고 있는 Window 8 32비트, Window 10 64비트와 같은 운영체제가 있습니다. 32 비트 시스템에서는 주소 값을 표현하는데 32비트(1Byte는 8Bit 즉, 4Byte)를 사용하고, 64비트에서는 64비트를 사용합니다. 32비트 시스템에서 사용할 수 있는 최대 메모리 공간은 2의 32승(4GB)이고, 64비트에서는 2의 64승 이라는 계산하기도 힘든 메모리 공간을 사용할 수 있습니다.
& 연산자
"아 그래 포인터 변수가 주소 값을 가지고 있는 것은 알겠어. 그럼 주소 값은 어떻게 볼 수 있는데?"
[소스코드]
#includeint main(void) { int num1 = 3; char num2 = 'A'; double num3 = 1.23; printf("num1의 저장 위치 : %#x \n", &num1); printf("num1의 저장 위치 : %#x \n", &num2); printf("num1의 저장 위치 : %#x \n\n", &num3); printf("num1의 주소 값 크기 : %d \n", sizeof(&num1)); printf("num1의 주소 값 크기 : %d \n", sizeof(&num2)); printf("num1의 주소 값 크기 : %d \n", sizeof(&num3)); return 0; }
[실행 결과]
포인터 변수 선언 방법
위에서 주소 값을 저장해서 출력하는 것이 아닌 그냥 출력해보는 것을 해보았습니다. 이번에는 주소 값을 저장할 수 있는 변수인 포인터 변수의 선언 방법에 대해 알아 보도록 하겠습니다.
TYPE * ptr;
포인터 변수는 위와 같이 일반 변수 선언하는 것에서 *만 하나 추가되는 것입니다. *의 위치는 아래와 같이 공백 삽입은 문제가 되지 않습니다.
- TYPE* ptr;
- TYPE * ptr;
- TYPE *ptr;
이렇게 선언된 문장을 다음과 같이 표현하면 정확합니다.
"포인터 변수 prt는 TYPE 형 변수의 주소 값을 저장하고 있다."
* 연산자
* 연산자는 이항 연산자로 사용되었을 때, 곱셈이었으나 단항 연산자로 사용되면 포인터가 가리키는 메모리 공간의 접근을 의미합니다.
[소스코드]
#includeint main(void) #include int main(void) { int num = 10; int * ptr; // ptr은 num을 가리킨다. ptr = # // *ptr은 ptr의 저장된 주소 값의 메모리 공간을 참조하라는 것으로, 즉 변수 num을 참조하라는 뜻이다. printf("ptr이 가리키는 변수의 값 : %d\n", *ptr); printf("num에 저장된 값 : %d\n\n", num); // 현재 ptr은 num을 가리키니 *ptr은 num을 가리킨다. *ptr = 20; printf("ptr이 가리키는 변수의 값 : %d\n", *ptr); printf("num에 저장된 값 : %d\n\n", num); (*ptr)++; printf("ptr이 가리키는 변수의 값 : %d\n", *ptr); printf("num에 저장된 값 : %d\n\n", num); }
[실행결과]
반응형