[C++ ] 1차원 포인터 정리
C++의 꽃은 역시나 포인터.
C++ 에서 코딩을 더 편하게 하라고 만든 문법이다.
아직 익숙하지 않아서 어렵게 느껴질 수 있으나,
포기하지 않고 하다보면 구구단 처럼 쉽게 느껴진다.
포인터란?
int가 정수형을 반환, double이 실수를 반환 한다.
이처럼, 포인터는 어떤 변수의 주소를 저장 해 뒀다가
포인터가 저장해둔 주소가 가지고 있는 변수 값을 반환한다.
포인터에서 사용하는 연산자
주소 연산자(&) : 변수 앞에 &을 붙여 변수의 주소를 반환.
참조 연산자(*) : 포인터의 앞에 *을 붙여 포인터가 가리키는 주소에 저장된 값을 반환.
메모리 주소 할당 개념
우선, 우리가 프로그램을 실행하면 변수마다 메모리가 할당된다.
메모리가 할당 되면 컴퓨터를 위해서 주소들이 배정된다.
주소가 할당되는 이유는 컴퓨터가 주소를 찾아서 변수값을 가져온다. 그러면 여기서 스택같은 자료구조도 연관되어 있다. 구글링해서 찾아보자.
메모리 주소는 프로그램 재시작시 매번 바뀐다.
아래예제를 두 번 실행 시켜보자.
#include <iostream>
using namespace std;
void main()
{
int num = 100; // 변수 선언
int *ptr; // 포인터 선언
cout << "num 주소: " << &num << endl;
cout << "ptr 주소: " << &ptr << endl;
}
첫번째 실행
두번째 실행
위처럼 메모리주소 할당이 매번 바뀐다.
&연산자를 사용하여 주소를 확인 할 수있다.
변수든 함수든 프러그램 시작 시 메모리 주소를 할당한다는 것을 알고있으면 된다.
자세한 부분은 C++ 메모리 주소를 구글링 해서 찾아볼것.
예제
#include <iostream>
using namespace std;
void main()
{
int num = 100; // 변수 선언
int *ptr; // 포인터 선언
ptr = # // ptr(포인터)가 변수(num)을 가리킨다.
cout << "num 주소: " << &num << endl;
cout << "ptr 주소: " << &ptr << endl;
cout << endl;
cout << "ptr이 가리키는 주소 : " << ptr <<" (num의 주소) " << endl;
cout << endl;
cout << "num 값: " << num << endl; // num 값 출력
cout << "ptr 참조값: " << *ptr << endl; // ptr 참조 값 출력
}
실행결과
예제 설명
우선 포인트 선언 시 두 가지 방법이 있다.
포인터 선언 1번
int num = 100; // 변수 선언
int *ptr; // 포인터 선언
ptr = # // ptr(포인터)가 변수(num)을 가리킨다.
포인터 선언 2번
int num = 100; // 변수 선언
int *ptr = # // ptr(포인터)가 변수(num)을 가리킨다.
1번은 포인터 선언 후 num의 주소를 넣기.
2번은 포인터 선언과 동시에 num의 주소 넣기.
1번과 2번은 결국 같다.
1번으로 설명 하자면,
1. *ptr을 선언 하여 num의 메모리 주소를 가리킬 포인터를 선언한다.
(ptr앞에 * 를 붙임으로서 다른 변수에 메모리 주소를 가리킬 수있게 되었다.)
2. *ptr(포인터)안에 num의 주소를 넣는다.
그러면 *ptr이 num주소를 가리킨다. *ptr을 봔환 시 자신이 가지고 있는 주소의 변수(num)
을 반환 할 수있다.
여기서 많이 헷갈려 하는 부분이 있다.
num의 주소가 0X10
ptr의 주소가 0X20 이라고 가정을 해보자.
ptr = # 시 ptr이 num을 가르킨다고 해서 num의 주소나 ptr의 주소는 변하지 않는다.
num 의 주소는 0X10이며,
*ptr의 주소는 0X20이고, *ptr이 가리키는 주소는 0X10이므로 둘은 다르다.
-----------------------------------------------------------------------------------------
cout << "num 주소: " << &num << endl;
cout << "ptr 주소: " << &ptr << endl;
cout << endl;
cout << "ptr이 가리키는 주소 : " << ptr <<" (num의 주소) " << endl;
cout << endl;
cout << "num 값: " << num << endl; // num 값 출력
cout << "ptr 참조값: " << *ptr << endl; // ptr 참조 값 출력
출력을 해서 변수와 포인터의 메모리 주소와 값을 확인 해보면 된다.
정리를 하자면
&ptr을 출력시 *ptr의 주소를 반환
ptr을 출력시 *ptr이 가리키고 있는 num의 주소를 반환
*ptr을 출력시 num의 변수를 반환 (포인터가 가리키고 있는 주소가 가지고 있는 변수 값.)
포인터는 C++ 개발자에게 기본이자 많은 활용이 가능 하니 확실히 이해하고 넘어가자
끝.
댓글
댓글 쓰기