반응형

c언어 포인터를 이용한 스왑함수, 전역 변수를 이용한 스왑함수.

@ 포인터 변수

int a=5; //일반적인 변수

/*----------------------------*/

int *p;

char *p;

밑에 두 개 변수의 형태를 포인터 변수라고 합니다.

각각, 인트형 주소와 캐릭터형 주소를 저장할 수 있는 포인터 변수입니다.

 

포인터 변수에는 어떤 값이 아니 주소가 담기게 되는데 주소를 담기 위해서 &(주소연산자를) 변수명 앞에 붙여주게 됩니다.

*p=&a;

 

#include <stdio.h>

int main()

{

    int *p; //포인터 변수 p

    int a=5; //일반 변수 a

    p=&a;

 

 

    printf("변수 a의 값 : %d\n",a);

    printf("변수 a의 주소 : %d\n",&a);

 

    printf("포인터 변수 p의 값 : %d\n",p);

    printf("포인터 변수 p의 주소 : %d\n",&p);

    printf("포인터 변수 p가 가리키는 변수의 값 : %d\n",*p);

}

변수 a의 주소 == 포인터 변수 p의 값

변수 a의 값 == 포인터 변수 p가 가리키는 변수의 값

 

 

@ 왜 필요한가?

함수의 리턴값(반환값)이 두 개 이상이라면, 일반적인 방법으로는 불가능 하지만 포인터를 이용하면 가능하다.

 

@ 스왑 구현

- 메인 함수 내에서 처리할 때.

#include <stdio.h>

int main()

{

    int a=5;

    int b=10;

    int temp;

 

    printf("값 교환 전 a: %d b: %d\n",a,b);

 

    temp=a;

    a=b;

    b=temp;

 

    printf("값 교환 후 a: %d b: %d\n",a,b);

 

}

 

이런 식으로 가능하지만, 만약에 스왑 구문이 여기저기 자주 쓰인다면 함수로 작성하는 것이 보기도 좋고 코딩하기도 편할 것입니다.

 

 

- 함수 구현

#include <stdio.h>

void swap(int a, int b);

int main()

{

    int a=5;

    int b=10;

 

    printf("값 교환 전 a: %d b: %d\n",a,b);

 

    swap(&a,&b);

 

    printf("값 교환 후 a: %d b: %d\n",a,b);

 

}

 

void swap(int *a, int *b)

{

    int temp;

 

    temp=*a;

    *a=*b;

    *b=temp;

    

}

교환 전 과 교환 후의 값이 정상적으로 교환 되었습니다.

 

메인 함수에서 swap(&a, &b); 호출

a와 b 변수의 주소를 넘겨 주었습니다.

 

swap함수에서는 포인터 변수 int *a와 int *b로 그 주소들을 받고

스왑구문을 통해 각각 포인터 변수들이 가리키는 값들을 교환 합니다.

 

 

- 함수 구현(전역변수 이용)

#include <stdio.h>

void swap();

int a,b;

 

int main()

{

    a=5;

    b=10;

 

    printf("값 교환 전 a: %d b: %d\n",a,b);

    

    swap();

        

    printf("값 교환 후 a: %d b: %d\n",a,b);

 

}

 

void swap()

{

    int temp;

 

    temp=a;

    a=b;

    b=temp;

    

}

언뜻 포인터 사용한 것 보다 간단해 보이지만..

두 가지 방법의 장.단 점이 있으니. 판단은 프로그래머의 몫?

 

- 함수 구현(포인터 없이)

#include <stdio.h>

void swap(int a, int b);

int main()

{

    int a=5;

    int b=10;

 

    printf("값 교환 전 a: %d b: %d\n",a,b);

 

    swap(a,b);

 

    printf("값 교환 후 a: %d b: %d\n",a,b);

 

}

 

void swap(int a, int b)

{

    int temp;

 

    temp=a;

    a=b;

    b=temp;

    

}

교환 전 후 값이 그대로 입니다.

스왑 함수 내부에서 값 교환은 이루어지나 그 값들은 다시 메인함수로 리턴(반환) 하지 못하기 때문입니다.

반응형

'Computer > Programing' 카테고리의 다른 글

c언어 2차원 배열  (0) 2013.12.21
c언어 삽입정렬  (0) 2013.12.13
c언어 선택정렬  (0) 2013.12.12

+ Recent posts