티스토리 뷰

c언어 - 포인터 정리 및 간단한 예제

 

[포인터(Pointer)]

C언어에서는 간접 주소 지정 방식으로 포인터(Pointer)라는 문법을 제공합니다.

사용자가 사용하고 싶은 메모리의 주소를 저장하고 있는 변수입니다.

 

int *ptr;

-> 자료형이 int인 ptr 포인터 변수 선언

 

 

포인터는 값이 아닌 주소를 저장하는 데 쓰입니다.

 

 

 

 

변수의 메모리 주소를 출력해보겠습니다.

#include <stdio.h>
 
 
int main(void)
{
    int a;
    int* ptr; // 포인트 변수 선언
    ptr = &a; // 변수 a의 주소를 ptr에 대임
 
    printf("변수 a의 주소는 : %d", ptr);
   // a의 주소값 출력
    return 0;
}
cs

 

위의 예제는

일반 변수 a를 만들어주었고

포인터 변수 ptr을 만들어주었습니다.

그리고 a의 주소 값을 ptr에 저장해

a의 주소를 출력시켜보았습니다. 

a의 주소는 16186908이라는 것을 알 수 있습니다.

 

 

 

 

그러면 만약 위의 예제에서 a에 3을 넣고 

포인터를 사용해 a에 들어있는 값인 3을 출력시키려면

어떻게 해야 하는지 알아보겠습니다.

int main(void)
{
    int a = 3;
    int* ptr;
    ptr = &a;
 
    printf("변수 a의 주소는 : %d \n", ptr);
 
    printf("a의 값은 : %d \n"*ptr);
    
    return 0;
}
cs

이 코드를 보면 결과적으로

ptr : 포인터 변수가 가리키는 대상의 주소를 나타내고,

*ptr : 포인터가 가리키는 대상의 값을 나타내는 것을 알 수 있습니다.

 

 

 

여기까지 정리해 보자면

int a=3;    // int형 a를 선언하고 a에 3을 대입해준다.

int *ptr;    // int형 포인터 변수 ptr을 선언해준다.

ptr = &a;  // 포인터 변수 ptr에 변수 a의 주소를 대입시켜준다. 

*ptr = 5;  // ptr에 저장된 주소로 이동해 5를 대입 (a에 들어가 있는 3을 5로 바꾸어줄 수 있다.)

이처럼 정리해볼 수 있습니다.

 

 


[코드 예제]

 

여기까지 간단하게 포인터를 정리해보았습니다.

 

다음 예제를 통해 간접 주소 방식인 포인터가 쓰이는 이유에 대해 한번 알아보겠습니다.

 

 

 

먼저 a 값과 b 값을 교환하는 스왑 함수를 만들어보겠습니다.

 

#include <stdio.h>
 
void swap(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
 
 
int main(void)
{
    int n = 3, m = 5;
    
    printf(" 값을 교환하기 전 값 n : %d , m : %d\n",n,m);
    swap(n, m);
    printf(" 값을 교환한 후 값 n : %d , m : %d", n, m);
 
    return 0;
}
cs

이처럼 함수를 이용해서 a b를 교환하는 스왑함수를 만들어보았습니다.

얼핏 보면 n과 m값이 교환될 것으로 보이지만 실제로 출력시켜보면

 

결과값이 

교환하기 전 값이 n은 3 m은 5 이고

교환한 후에도 n은 3 m은 5인 것을 보실 수 있습니다.

결과적으로 값이 바뀌지 않았습니다.

 

얼핏 보면 값이 함수로 넘어가 교환이 된 후에

다시 메인 함수로 값이 넘어온 것처럼 보일 수 있겠지만 

 

함수에서 a b 값이 교환은 되었지만 

다시 메인 함수로 교환된 값이 넘어오지 못한 것입니다.

 

이 같은 문제를 해결하기 위해서

간접 주소 지정방식인 포인터(Pointer)가 사용되는 것입니다.

 

 

 

 

포인터를 사용해 위의 문제를 해결해 보겠습니다.

#include <stdio.h>
 
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *= *b;
    *= temp;
}
 
 
int main(void)
{
    int n = 3, m = 5;
    
    printf(" 값을 교환하기 전 값 n : %d , m : %d\n",n,m);
    swap(&n, &m);
    printf(" 값을 교환한 후 값 n : %d , m : %d", n, m);
 
    return 0;
}
cs

 

n과 m 앞에 &를 적어주었고

swap 함수안의 a와 b 앞에는 *를 적어줘 코드를 바꾸었습니다.

 

결과값이 아래와 같이 바뀐 것을 보실 수 있습니다.

 

간접 주소 지정방식인 포인터를 사용해 n 와 m을 바꾸어 보았습니다.

 

위의 예제는 포인터를 배우는데 가장 기본적으로 많이 쓰이는 예제입니다.

 

위의 예제를 한번 적어보시고 

공부해보신다면 

기본적인 포인터 문법을 이해하실 수 있을 것입니다.

 

이상 포인터에 대해 간단하게 알아보았습니다 ~:)