포인터란?
정수형이나 실수형의 일반적인 변수들은 수치값을 저장한다.
이에 비해 포인터형은 번지를 기억한다.
포인터의 쓰임
데이터가 보관되어 있는 메모리 위치를 기억하고 있기 때문에 직접 값을 조작할 수도 있고 주변의 다른 값
까지도 손댈 수 있다.
위치는 단순히 4바이트의 번지이기 떄문에 함수의 인수로 전달하거나 받기도 효율적이며 함수로 포인터를
전달하면 포인터가 가리키는 메모리를 함수가 직접 조작이하는 것이 가능하다.
번지(address)의 개념
컴퓨터의 주 기억장치로 사용되는 RAM은 용량이 아주 커서 보통 백만 , 10억 단위를 사용한다.
32비트 운영체제에서 각 프로그램은 32비트의 가상 메모리 공간을 사용할 수 있다.
즉 값을 기억할 수 있는 메모리의 용량은 최대4G가 된다.
컴퓨터는 메모리 중의 특정 바이트를 지정할 때 이 번지를 사용하여 정확한 위치의 값을 읽고 쓴다.
ex)
int Num; |
컴파일러는 이 선언문을 만났을 때 사용되지 않는 메모리 공간 4바이트를 할당하고 이 번지에 Num 이라는 이름을 붙여준다.
* num 이 실제 어떤 번지에 할당될 것인가는 여유 메모리가 어디쯤에 있는지에 따라 달라지기 떄문에 실행할 때마다 번지수가 다르다.
만약 num이 할당되어 있는 번지값을 알고 싶거나 직접 다루고 싶을 때 포인터라는 것이 필요하다.
ex)
int *pi; |
pi는 임의의 정수형 변수가 기억된 번지를 가질 수 있다.
* : 포인터가 가리키는 번지의 값을 읽는다.
& : 변수가 기억되어 있는 메모리 번지를 읽는다.
ex) { int num = 629; int *pi;
pi = # printf("num의 값은 %d 입니다.\n",*pi); } |
result : num 의 값은 629 입니다.
description : num은 -272632360 이라는 주소값이 저장되어있고 629라는 값을 가지고 있다.
*연산자는 포인터 변수가 가리키는 번지의 값을 읽는데 pi가 번지를 가리키고 있으므로 이 번지로 찾아가 그 값을 읽어온다.
왜 변수를 바로 읽으면 되는데 포인터라는 간접적인 방법을 사용하는가???
한 단계 더 중간 과정을 거치면 그 중간 과정에서 많은 유용한 조작이 가능해지기 떄문이다.
융통성을 위한 중간 과정(전문용어로 레이어라고 한다)을 사용해 한 번 더 과정을 거침으로써 많은 것들이 가능해진다.
포인터는 참조하는 것
{ int num1 , num2; int *pd;
num1 = 3; pd = &num1; num2 = *pd; printf("num2의 값은 &d 입니다.\n",num2);
} |
result)
num2 의 값은 3 입니다.
description)
num 2의 3이라는 값을 직접적으로 값을 할당한 것이 아니라 num1의 주소값을 포인터변수에 집어넣고
포인터변수를 num2에 할당함으로써 결과적으로 num1 의 값을 참조하여 num2의 값을 변경했다.
num2의 값은 원래 쓰레기값이였다.
* num1 의 값이 바뀌면 num2의 값도 바뀐다.
'C,C++' 카테고리의 다른 글
[C,C++] 배열과 포인터 (0) | 2019.02.28 |
---|---|
[C,C++] 이중 포인터 (0) | 2019.02.25 |
[C,C++] 포인터 동적 메모리 할당 (0) | 2019.02.25 |
[C,C++] 포인터 연산 (0) | 2019.02.25 |
[C,C++] 프로그래머의 동기 (0) | 2019.02.25 |