[C언어] 주소에 대한 swap 구현

2022. 6. 13. 00:42·언어/C
728x90
반응형

값에 대한 swap

C언어에서 함수로 값을 넘길때는 call by value기 때문에 모든 값이 복사되어 넘어갑니다.

 

#include <stdio.h>

void swapValue(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int num, num2;
    num = 1;
    num2 = 2;

    swapValue(&num, &num2);

    printf("%d %d\n", num, num2);
}

따라서 함수를 통해 두 변수의 값을 바꿔주기 위해서는

1. 주소를 복사해서 인자로 넘긴다.

2. 주소에 접근(* 연산자)해서 직접 값을 바꿔준다.

 

라는 두가지 단계를 통해 값에 대한 swap을 구현할 수 있었습니다.


주소에 대한 swap

#include <stdio.h>

int main()
{
    int num, num2;
    num = 1;
    num2 = 2;

    int *a, *b;
    a = &num;
    b = &num2;
}

하지만 a, b와 같이 포인터 변수의 값(주소)은 어떻게 바꿀 수 있을까요?

 

포인터 변수도 포인터 변수의 주소를 함수에 넘겨 swap 하면 해결할 수 있습니다.

 

포인터 변수의 주소를 받기 위해서는 이중 포인터가 필요합니다.

 

void swapPointer(int **left, int **right)
{
    ...
}

left와 right는 이중 포인터 변수로 단일 포인터 변수의 주소를 담을 수 있습니다.

 

 

 

이제 위와 같이 swap 함수를 구현해보겠습니다.

void swapPointer(int **left, int **right)
{
    int *temp = *left;
    *left = *right;
    *right = temp;
}

단일 포인터 변수 temp는 이중 포인터 left가 가지고 있는 값인 단일 포인터 변수의 주소를 저장합니다.

 

이후 이중 포인터 left에 접근(* 연산자)해서 이중 포인터 right가 가지고 있는 값인 단일 포인터 변수의 주소를 left에 저장합니다.

 

최종적으로 이중 포인터 right에 접근(* 연산자)하여 temp를 다시 저장하면 swap이 완료됩니다.

 

#include <stdio.h>

void swapPointer(int **a, int **b)
{
    int *temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int num, num2;
    num = 1;
    num2 = 2;

    int *a, *b;
    a = &num;
    b = &num2;

    printf("%d %d\n", *a, *b);

    swapPointer(&a, &b);

    printf("%d %d\n", *a, *b);
}

 

 

'언어 > C' 카테고리의 다른 글

[C언어] 배열 요소 접근과 포인터의 관계  (0) 2022.06.15
[C언어] 함수 포인터  (0) 2022.06.12
[C언어] Dangling Pointer와 Memory Leak  (0) 2022.06.12
'언어/C' 카테고리의 다른 글
  • [C언어] 배열 요소 접근과 포인터의 관계
  • [C언어] 함수 포인터
  • [C언어] Dangling Pointer와 Memory Leak
uinone
uinone
노는 게 제일 좋아😉
  • uinone
    ideaDummy
    uinone
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS
        • 확률과 통계
        • 자료구조
        • 논리회로
        • OS
        • 데이터 통신
        • 데이터 과학
        • 컴파일러
      • 알고리즘
        • 그리디
      • 컴퓨터 비전
      • 안드로이드
      • Web
        • CSS
        • TypeScript
        • React.js
      • 기타
        • 모각코
        • 메모장
        • 오류해결
        • 풍미박산 기절초풍 설치과정
      • DL
      • ML
      • 언어
        • C
        • Ocaml
      • Tensorflow
      • 8기 글로벌 SW*AI인재 프로그램
      • 논문 정리
        • 3D Object Detection
        • 3D Multi Object Tracking
      • CUDA
      • Dataset
        • NuScenes
  • 블로그 메뉴

    • LinkedIn
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그리디 알고리즘
    NetworkFlow
    백준
    우선순위 큐
    정렬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
uinone
[C언어] 주소에 대한 swap 구현
상단으로

티스토리툴바