<목차>
- 포인터의 개념
- 주소연산자 & 와 간접 참조 연산자 *
- 포인터 연산
- 포인터와 함수
- 포인터와 배열
포인터(pointer)의 개념
포인터는 메모리의 주소를 가지고 있는 변수를 뜻한다. 여기서 메모리의 주소에 대해 좀 더 깊이 알아보자.
우리는 코드를 짤 때 주로 변수를 만들어 사용했다. 그렇다면 이 변수는 어디에서 만들어지는 것일까?
>> 메모리(memory) 에 만들어진다. (이 때 메모리의 단위는 바이트이다.)
메모리에서는 각 바이트마다 고유한 주소가 매겨진다. 이들 주소를 사용하여 메모리 바이트에 접근이 가능.
>> 프로그램에서 변수를 만들면 이들 변수는 컴파일러에 의하여 메모리 공간의 비어있는 위치를 차지.
>> 변수의 크기에 따라서 차지하는 메모리 공간의 크기가 달라진다.
포인터 변수의 선언은 예를 들어, 다음과 같다. >> int *pnum; >> 즉, pnum이라는 포인터 변수를 선언한 것과 같은 뜻
주소연산자 &
포인터는 메모리의 주소를 가지고 있는 변수
>> 즉, 포인터는 변수의 주소를 가지고 있음.
>> 그렇다면 우리는 변수의 주소를 어떻게 알아낼 수 있을까?
바로, 주소연산자 &를 통해 알아낼 수 있다.
>>주소연산자 &는 변수의 이름을 받아서 변수의 주소를 반환한다.
간접 참조 연산자 *
포인터가 메모리의 주소를 저장해서 우리에게 줄 수 있는 장점이 무엇이 있을까?
>> 포인터를 통하여 값을 읽어오거나 값을 변경할 수 있기 때문이다.
그렇다면 어떻게 해야 그 값을 읽어올 수 있을까?
>>포인터가 가리키는 주소에 저장된 내용을 읽으려면 포인터 변수의 이름 앞에 * 기호를 붙이면 된다. (ex. *p)
>> 이것을 포인터를 통하여 메모리를 간접 참조 한다고 한다.
그러면 이제, 주소 연산자와 간접 참조 연산자를 통해서 간단하게 돌아가는 과정을 이해해보도록 하자.
선언된 포인터 변수에 변수의 주소값을 대입한 후, 이를 출력하게 되면 어떻게 되는지 보자.
(만약 포인터 변수를 선언만 하고 초기화를 하지않게 되면, 포인터에는 아무 의미 없는 쓰레기 값을 가지게 된다.)
#include <stdio.h>
int main(){
int num=22;
int *pnum; // 포인터 변수 pnum의 선언
pnum=#
// 주소연산자 &를 통해 구한 변수 num의 주소 값을 변수 pnum에 저장.
printf("%d", *pnum); // 22가 출력된다.
return 0;
}
포인터 pnum이 가리키는 변수가 num이라면, *pnum은 변수 num과 동일하다.
따라서, *pum를 출력하면 변수 num이 출력되고, *pnum에 어떤 값을 저장하면 변수 num에 그 값이 저장된다.
>> 결론적으로 포인터를 이용하면 변수를 간접적으로 참조할 수 있게 된다.
또한, 다양한 타입의 데이터를 가리키는 포인터를 생성할 수 있다
ex) char *pc; float *pf; double *pd; ...
이 때, 주소는 한 가지 형식인데 다양한 타입으로 나눌 수 있게되는 이유는 무엇일까?
>> 포인터가 가리키는 대상을 확실하게 함으로써 프로그래밍 실수를 에방하기 위해서이다.
>> 또한 포인터의 타입이 없다면 포인터를 이용하여 데이터를 읽어 들일 때, 몇 개의 바이트를 읽어야 할지 알 수 없게 된다.
(타입에 따라 읽어야할 바이트의 개수가 달라지기 때문이다)
글 내용에 오류사항이 있을 시 지적해주시면 감사하겠습니다.
'프로그래밍 언어 💬 > C++' 카테고리의 다른 글
[백준] 2439번, 2440번, 2441번 [별찍기 (1)] (0) | 2020.12.31 |
---|---|
문자열을 나타내기 위한 클래스 "string" (0) | 2020.12.30 |
[백준] 11720번 (0) | 2020.12.26 |
[백준] 10953번 (0) | 2020.12.26 |
[백준] 10951번 (0) | 2020.12.26 |