포인터는 번지에 대한 기호화된 표현을 말한다. 즉, 포인터는 번지이다.
1 | int pint; |
pint라는 변수를 정의하면, 시스템이 프로그램이 실행중에 위의 정의를 만나면 pint에 대하여 4바이트의 메모리를 할당해준다. 시스템이 할당해준 4바이트는 다른 프로세스(다른 실행중인 프로그램)들이 할당 받지 못하므로 안전하게 사용할 수 있다. 이 4바이트는 각 바이트마다 모두 주소를 가지고 있는데 이를 번지라고 한다. 결국 포인터라는 것은 메모리의 위치(번지)를 표현한 기호인 것이다.
포인터 변수 - 포인터는 메모리의 특정 위치(주소,번지)를 가리킨다고 했다. 포인터 변수는 포인터(주소, 번지)를 저장할 수 있는 변수를 말한다. 포인터 변수는 번지 이외에는 어떠한 것도 들어갈 수 없다는 사실 또한 잊어선 안된다.
포인터 변수의 정의
1 2 | int* pint; // 1. int *pint // 2. |
1 2 3 4 | int* pint pint = 5; pint = 'a'; |
1 2 3 4 5 | int* pint int iCount = 5; pint = &iCount; |
바로 이렇게 포인터 변수에 주소를 할당 하는 것이다. 일반 자료형(포인터 자료형이 아닌)의 앞에 & 연산를 사용하면 일반 자료형을 사용하는 변수들의 주소를 얻어 올 수 있다.
포인터 변수의 타입
포인터 변수는 아래와 같이 타입별로 존제한다.
1 2 3 4 | int* pi; float* pf; double* pd; char* pc; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include<stdio.h> int main(){ int int_; float float_; double double_; char char_; int* pint; float* pfloat; double* pdouble; char* pchar; printf("int[%d] float[%d] double[%d] char[%d]\n", sizeof(int_), sizeof(float_), sizeof(double_), sizeof(char_)); printf("int[%d] float[%d] double[%d] char[%d]", sizeof(pint), sizeof(pfloat), sizeof(pdouble), sizeof(pchar)); } |
결과가 궁굼할 것이다. 이야기 하고 싶은 부분은 바로 2번째 printf이니 두번째 printf결과를 확인하는 것이 중요할 것이다.
32비트인 경우 4바이트 64바이트인경우 8바이트가 나왔을 것이다.
여기서 우리는 한가지 알아야할 사실이 있다. 바로 포인터 변수는 모두 같은 바이트에 주소를 저장하는 구나 그리고 더 나아가 유추한다면 주소의 길이가 모두 같기 때문에 다 같을 수도 있겠다라고 유추도 해볼 수 있을 것이다.
그리고 타입이 필요한 이유는 1번째 printf에서 찾을 수 있다. 포인터 변수는 포인터(주소)를 저장한다고 했다. 그런데 주소만 저장 되어 있지 주소가 몇 바이트인지 포인터 변수에 표시해 주질 않았다. 바로 이부분이다. 포인터 변수의 타입은 이런 점을 고려하여 컴파일 타임에 몇 바이트의 주소를 호출해야 하는지를 명세 하기 위해 타입을 적어 주는 것이다. 꼭 알아 두어야 한다.
이상 포인터의 기초
끝..
'C, C++' 카테고리의 다른 글
[c언어]값에 의한 호출 대 참조에 의한 호출 (call by value vs call by reference) (2) | 2016.01.26 |
---|---|
[c언어] void 포인터 (0) | 2016.01.26 |
[C언어] 2차원 배열과 포인터 (0) | 2014.07.06 |
[C언어] 1차원 배열과 포인터 (0) | 2014.06.29 |