포인터 변수,
포인터가 헷갈리는건 다음과 같습니다.
1. 선언과 대입시 *(애스터리스크)의 실제 사용이 다르다는 점
2. 포인터의 목적(배열과 연관)
3. 포인터 선언 과정에 대한 이해
선언
int* pCount;
어떤 타입인지, 몇 바이트를 참조하는지, 포인터 변수에 어떤것을 참조할것인지 생각해봅시다.
그리고
int count = 2;
int* pCount = &count;
1) count에는 어떤 값이 들어가는지,
2) count의 시작 주소를 1001이라고 한다면, pCount에 무엇이 할당되는지를 생각해보면 됩니다.
int 타입의 주소를 참조할 것이라는 의미 입니다.
int형은 4바이트 이기 때문에, 시작주소로부터 4바이트를 읽어야 한다는 정보를 제공하지만
만약 데이터타입이 char이라면 1바이트이기 때문에 해당 주소값 부분만 읽는다는 정보를 제공합니다.
*(애스터리스크)는 포인터 변수라는 것을 의미합니다.
포인터 변수라는 것은 일반적인 변수와는 다릅니다.
일반 변수는 값을 저장하는 반면,
포인터 변수는 주소를 저장합니다.
이해를 돕기 위해 다음과 같은 예시를 만들어 보고 해석해봅시다.
int count = 2;
int* pCount = &count;
int count = 2;
count에는 값 2가 들어있습니다.
만약 count의 "시작"주소가 1001 이라면, &count는 1001을 의미합니다.
&(앰퍼샌트)는 count변수가 메모리에 위치한 주소를 의미합니다.
int* pCount = &count;
4바이트(데이터타입이 int형이기 때문)이며, 포인터 변수라는 것을 의미하고(애스터리스크 : *), 포인터 변수인 pCount에는 count의 주소(앰퍼샌트 : &)를 할당합니다
위에서 만약 count의 "시작"주소가 1001 이라면, &count는 1001을 의미하는 것으로 예를 들었기 때문에,
pCount에 count의 주소인 1001이 할당됩니다.
이해를 돕기 위해서 반드시 그림을 그려가며 스스로에게 설명할수 있어야 합니다.
포인터 변수 선언 이후,
참조하는 방법에는 두 가지가 있습니다.
1. 주소를 참조 : 직접 참조
2. 값을 참조 : 간접 참조
*(애스터리스크)
&(앰퍼샌트)
다음과 같이 포인터 변수인 pHello와 int타입의 변수인 hello가 있습니다.
int hello;
int* pHello;
다음에 제시된 내용을 그림을 그려가며 순서에 따라 설명해 보세요.
1) hello = 3;
2) pHello = &hello;
3) *pHello = 7;
hello = 3;
pHello = &hello;
*pHello = 7;
pHello와 *pHello가 어디를 참조하는지 반드시 기억해 두세요.
주소를 참조하는 것과 값을 참조하는 것, 다음의 문제를 풀어보며 익혀보도록 합시다.
[1]
다음과 같이 변수 num과 포인터변수 pNum이 정의되어 있습니다.
int num = 3;
int* pNum = #
1) num에 5를 대입하려고 합니다. 다음중 맞는 것을 고르세요.
(1) pNum = 5;
(2) *pNum = 5;
(2) *pNum = 5;
*pNum에 값을 대입할 수 있습니다.
2) int num1 = 10;
변수 num1을 새로 만들었습니다.
포인터 변수인 pNum에 num1의 주소를 대입하려고 합니다. 다음중 맞는 것을 고르세요.
(1) pNum = &num1;
(2) *pNum = &num1;
(1) pNum = &num1;
pNum은 주소를 대입할 수 있습니다.
[2]
다음과 같이 변수 num과 포인터변수 pNum이 정의되어 있습니다.
int num = 3;
int* pNum ;
1) 포인터 변수인 pNum에 num의 주소를 대입하려고 합니다. 다음중 맞는 것을 고르세요.
(1) pNum = #
(2) *pNum = #
(1) pNum = #
pNum은 주소를 대입할 수 있습니다.
2) int num2 = 10;
변수 num2를 새로 만들었습니다.
포인터 변수인 pNum을 이용해서 num2에 값 20을 대입하려고 합니다. 다음중 맞는 것을 고르세요.
(1)
pNum = &num2;
pNum = 20;
(2)
pNum = &num2;
*pNum = 20;
(3)
*pNum = &num2;
pNum = 20;
(4)
*pNum = &num2;
*pNum = 20;
(2)
pNum = &num2;
*pNum = 20;
*pNum에 값을 대입할 수 있으며
pNum은 주소를 대입할 수 있습니다.
[3]
int num1 = 3;
int num2 = 7;
int* pNum1;
int* pNum2;
(1) num1의 값과 num2의 값을 더하는 식을 pNum1과 pNum2를 사용해 옳게 표현한 것을 고르세요.
1)
pNum1 = &num1;
pNum2 = &num2;
pNum1 + pNum2;
2)
*pNum1 = &num1;
*pNum2 = &num2;
pNum1 + pNum2;
3)
pNum1 = &num1;
pNum2 = &num2;
*pNum1 + *pNum2;
4)
*pNum1 = &num1;
*pNum2 = &num2;
*pNum1 + *pNum2;
3)
pNum1 = &num1;
pNum2 = &num2;
*pNum1 + *pNum2;
*pNum에 값을 대입할 수 있으며
pNum은 주소를 대입할 수 있습니다.
글의 첫 머리에서,
1. 선언과 대입시 *(애스터리스크)의 실제 사용이 다르다는 점을 언급했는데,
사실은
선언을 할 때는
datatype* 이 부분은 단순히 포인터 변수라는 것을 나타내 줍니다.
* (애스터리스크)가 포인터 변수라는 것을 나타내준다는 것으로만 기억해야지 그렇지 않으면
대입문에서도 * (애스터리스크)가 등장하는데, "정 반대 같네? 헷갈려 ... " 하고 어렵게 느껴지게 됩니다.
int hello = 3;
int* pHello; //여기서의 *(애스터리스크)는 단순히 포인터 변수라는 것을 나타내며, 값, 주소값 과는 전혀 관계가 없다. 다만, 포인터 변수이기 때문에, 선언과 동시에 초기화를 한다면 참고할 변수의 주소값을 대입해주면 된다는 것으로 기억하세요.
pHello =&hello; //*(애스터리스크)가 붙지 않으면 주소를 참조하고
*pHello =7; //*(애스터리스크)가 붙으면 값을 참조합니다.
'--------------------** > C++ 프로그래밍2' 카테고리의 다른 글
c++ vector (0) | 2020.02.16 |
---|---|
배열과 포인터 (0) | 2020.02.11 |