-
[C Language] 35. 포인터 기초 - C 언어CSE/C Language 2015. 7. 20. 14:08
1. 포인터란?
포인터란 메모리의 위치를 기호화한 표현이다. 우리가 친구 집을 찾아가기 위해서는 주소가 필요한 것처럼 시스템에서도 특정한 값을 찾기 위해서는 주소가 필요하다. 실생활에서의 주소는 시, 도, 군등으로 나누지만 시스템에서는 4 바이트로 표시하도록 되어 있으며 일반적으로 다음과 같이 표기한다.
0x4600F269
상당히 기계적인 표현이라 정이 안가는 형태이지만 포인터를 정복하기 위한 가장 첫 걸음이므로 너무 거부감을 갖지말고 보자. 언젠가는 정감있는 표현으로 다가올 날이 있을 것이다. 0x 는 다음에 이어지는 표현이 16진수임을 뜻하고 연이은 8 자리 문자와 숫자의 조합은 주소 값을 의미한다. 16진수이기 때문에 숫자 중간에 A ~ F 까지의 문자가 올 수 있다. 우리는 흔히 자신의 컴퓨터 사양을 이야기할 때 256M, 512M로 이야기하는데 이것은 메모리의 크기를 말하는 것이다. M 은 1024 X 1024 byte를 뜻하므로 256M 의 메모리는 256 X 1024 X 1024 byte의 크기를 가진다. 즉, 268,435,456 byte를 저장할 수 있다는 말이 되므로 약 2 억개의 문자나 숫자를 저장할 수 있다.
아래 예제를 통해 변수의 할당 값, 메모리 주소, 크기를 알아보자.
1234567891011121314151617181920/** pointer.c** Created on: 2015. 7. 19.* Author: Yeonsu*/#include <stdio.h>int main(void) {int tmp = 777;printf("tmp에 저장된 값: %d\n", tmp);printf("tmp의 주소: %#x\n", &tmp);printf("tmp를 저장하기 위한 메모리 크기: %d\n", sizeof(tmp));return 0;}cs 2. 포인터 변수
포인터를 다루기 위해서는 맨 먼저 포인터 변수를 정의해야 한다. 포인터 변수란 포인터를 저장할 수 있는 변수를 말한다. int 형 변수는 정수를 저장하는 변수이다. 포인터 변수는 당연히 포인터를 저장하는 것이다. int 형에 float 형을 대입하면 문제가 발생하는 것 처럼 포인터 변수에 포인터 이외의 값을 넣으면 당연히 문제가 발생한다.
'포인터 변수에는 포인터(주소, 번지) 값 이외에는 절대 어떤 값도 들어갈 수 없다.'
3. 포인터 변수의 정의
포인터 변수를 정의하는 방법은 다른 변수를 정의하는 것과 크게 다르지 않다.
123456int *int_p;char *char_p;float *float_p;cs 정수형 변수, 문자형 변수, 실수형 변수의 앞에 '*' 만 붙여주면 그것이 곧 포인터 변수가 된다.
4. 번지 연산자 &, *
포인터 변수는 주소값 이외에는 할당되지 않는다고 했으므로 당연히 포인터 변수에 주소 값을 할당하는 방법이 있어야 할 것이다.
다음은 포인터 변수에 주소 값을 저장하는 예제이다.
1234567891011121314151617181920212223242526/** pointer.c** Created on: 2015. 7. 19.* Author: Yeonsu*/#include <stdio.h>int main(void) {int tmp = 5;int *tmp_p;tmp_p = &tmp;printf("tmp = %d\n", tmp);printf("&tmp = %#x\n", &tmp);printf("tmp_p = %#x\n", tmp_p);printf("&tmp_p = %#x\n", &tmp_p);printf("*tmp_p = %d\n", *tmp_p);return 0;}cs & 번지 연산자
변수 앞에 사용하여 그 변수가 저장된 메모리의 위치를 나타낸다.
ex) &tmp: tmp가 저장된 곳의 위치를 나타낸다.
* 번지 연산자
포인터 변수 앞에 사용하여 포인터 변수에 저장된 번지 값을 참조한다.
ex) *tmp: tmp안에 저장된 주소 값을 참조한다.
5. 쓰레기 주소 값
쓰레기 주소 값을 예제로 알아보자.
123456789101112131415161718/** pointer.c** Created on: 2015. 7. 19.* Author: Yeonsu*/#include <stdio.h>int main(void) {int *tmp_p;printf("tmp = %p\n", tmp_p);return 0;}cs 포인터 변수는 안전한 위치를 저장할 때 의미가 있다. 그러므로 반드시 포인터 변수 선언 시 초기화를 해주어야 한다.
6. 포인터 변수에 왜 형을 지정하는가?
포인터 변수에 왜 형을 지정하는지 그 이유에 대해 알아보자.
1234567int int_p;float float_p;double double_p;char char_p;cs 다음은 변수를 정의한 예제이다. 시스템이 메모리에 어느 정도의 크기를 할당하는지 알아보기 위해 sizeof 연산자를 사용하였다.
1234567891011121314151617181920212223242526/** pointer.c** Created on: 2015. 7. 19.* Author: Yeonsu*/#include <stdio.h>int main(void) {int int_p;short short_p;float float_p;double double_p;char char_p;printf("int = %d\n", sizeof(int_p));printf("short = %d\n", sizeof(short_p));printf("float = %d\n", sizeof(float_p));printf("double = %d\n", sizeof(double_p));printf("char_p = %d\n", sizeof(char_p));return 0;}cs 변수는 저마다 메모리 할당 크기가 다르다. 저장되는 정보의 양이 다르기 때문이다. 그렇다면 포인터 변수는 어떨까?
123456789101112131415161718192021222324252627/** pointer.c** Created on: 2015. 7. 19.* Author: Yeonsu*/#include <stdio.h>int main(void) {int *int_p;short *short_p;float *float_p;double *double_p;char *char_p;printf("int = %d\n", sizeof(int_p));printf("short = %d\n", sizeof(short_p));printf("float = %d\n", sizeof(float_p));printf("double = %d\n", sizeof(double_p));printf("char_p = %d\n", sizeof(char_p));return 0;}cs 포인터 변수는 어떠한 형(type)을 지정하든 무조건 4바이트가 할당된다는 거을 알 수 있다.
'CSE > C Language' 카테고리의 다른 글
[C Language] 38. 문자열과 포인터 - C 언어 (0) 2015.08.04 [C Language] 37. 2차원 배열과 포인터 - C 언어 (0) 2015.08.04 [C Language] 36. 1차원 배열과 포인터 - C 언어 (0) 2015.07.20 [C Language] 34. 레지스터 변수 - C 언어 (0) 2015.07.19 [C Language] 33. 정적변수 - C 언어 (0) 2015.07.19 [C Language] 32. 전역변수 - C 언어 (0) 2015.07.19