Basic/C

[C 언어] 포인터 변수 선언하기

에반황 2016. 7. 19. 01:25


이 글은 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승 이라는 계산하기도 힘든 메모리 공간을 사용할 수 있습니다. 


& 연산자

"아 그래 포인터 변수가 주소 값을 가지고 있는 것은 알겠어. 그럼 주소 값은 어떻게 볼 수 있는데?" 

[소스코드]
#include 

int 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;

}

[실행 결과]


& 연산자는 원래는 AND를 의미하는 비트연산자입니다. 하지만 &가 단항 연산자로 작용되면 피연산자의 주소 값을 나타내는 연산자가 됩니다. 사용법은 위의 코드를 보면 쉽게 알 수 있을 것이고, 또한 주소 값의 크기가 어떻게 표현되는지도 알 수 있습니다. 

포인터 변수 선언 방법


위에서 주소 값을 저장해서 출력하는 것이 아닌 그냥 출력해보는 것을 해보았습니다. 이번에는 주소 값을 저장할 수 있는 변수인 포인터 변수의 선언 방법에 대해 알아 보도록 하겠습니다.

TYPE * ptr;

포인터 변수는 위와 같이 일반 변수 선언하는 것에서 *만 하나 추가되는 것입니다. *의 위치는 아래와 같이 공백 삽입은 문제가 되지 않습니다.

    •  TYPE* ptr;
    •  TYPE * ptr;
    •  TYPE *ptr;

이렇게 선언된 문장을 다음과 같이 표현하면 정확합니다.

"포인터 변수 prt는 TYPE 형 변수의 주소 값을 저장하고 있다." 



* 연산자

* 연산자는 이항 연산자로 사용되었을 때, 곱셈이었으나 단항 연산자로 사용되면 포인터가 가리키는 메모리 공간의 접근을 의미합니다. 

[소스코드]

#include 

int 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);

}


[실행결과]







반응형