본문 바로가기

programming language/C 언어

c언어 포인터란?

우선 포인터 변수란? 메모리의 주소 값을 저장하기 위한 변수이다!

 

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가 서로 가리키는 대상을 바꾸는 과정이다.