우선 포인터 변수란? 메모리의 주소 값을 저장하기 위한 변수이다!
int main(void)
{
int num = 7; // 정수 7이 저장된 변수 num선언.
int * pnum; // 포인터 변수 pnum의 선언
pnum = # // num의 주소값을 포인터 변수 pnum에 저장
}
○ int * pnum; 의 문장이 포인터 변수의 선언이다.
1. pnum :포인터 변수의 이름
2. int * : int형 변수의 주소 값을 저장하는 포인터 변수의 선언.
○ pnum = #
위 문장에서 &연산자는 오른쪽에 등장하는 피 연산자의 주소값을 반환하는 연산자이다.
따라서 &연산의 결과로 변수 num의 주소 값이 반환되며, 이를 포인터 변수 pnum에 저장하게 된다.
포인터 형(type)이란?
우리가 int ,double, char과 같이 변수의 선언 및 구분에 사용되는 키워드를 '자료형'이라 하듯이,
포인터 변수의 선언 및 구분에 사용되는 int*, double*,char*등을 가리켜 포인터 형이라한다.
그렇지만 포인터 변수도 값을 저장하는 변수이기 때문에 포인터형 역시, 자료형의 범주에 포함시키기도 한다.
int * >> int 형 포인터
int * pnum; >>int 형 포인터 변수 pnum
double* >> double 형 포인터
double *pnum1; >> double형 포인터 변수 pnum
포인터가 가리키는 메모리를 참조하는 * 연산자
* 연산자는 포인터가 가리키는 메모리 공간에 접근할 때 사용하는 연산자이다.
int main(void)
{
int num = 10;
int * pnum = # //포인터 변수 pnum이 변수 num을 가리키게 하는 문장
*pnum = 20; //pnum이 가리키는 변수에 20을 저장하라
printf("% d", *pnum); //pnum이 가리키는 변수를 부호 있는 정수로 출력하라.
}
*pnum = 20; 의 문장은 포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 정수 20을 저장!
printf("% d", *pnum); 포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 저장된 값 출력!으로 해석 가능하다.
위 문제 11행을 보면 포인터 변수 pnum이 가리키는 대상을 num1에서 num2로 변경하고 있다.
pnum도 변수 이기 때문에 이처럼 저장된 값의 변형이 가능하다.(이것에 대하여 클릭하여 보기)
문제 12-1의 2번 문제이다
처음 잘못된 출력 값이 나온 풀이인데, 12행을 보면 (*ptr1) = &num2;인데 이는 잘못된 표현이다.
앞서 봤던 예제처럼 포인터 변수의 값을 변형하려는 목적이었는데, (*ptr1) 문장의 뜻이 포인터 변수 ptr1이
메모리 공간인 변수 num1이라는 뜻인데, 이 num1에 num2의 주소 값을 반환하는 것은 옳지 않다. 그러므로 위 문장이 잘못 짜여졌음을 알 수 있다.
<올바른 풀이>
8행에서 ptr1과 ptr2가 가리키는 대상을 서로 바꿔주기 위해 또 다른 int형 포인터 변수를 선언하였다.
12~14행이 ptr1과 ptr2가 서로 가리키는 대상을 바꾸는 과정이다.