고양이와 코딩

포인터 진짜 짜증남 본문

C

포인터 진짜 짜증남

ovovvvvv 2024. 6. 15. 20:45
728x90

하면 할수록 헷갈림 

 

* 함수 포인터의 일반적인 정의 *

(함수의 리턴형) (*포인터 이름) (첫 번째 인자 타입, 두 번째 인자 타입 ,,,,)
#include <stdio.h>

int pswap(int **pa, int *pb);
int main() {
    int a, b;
    int *pa, *pb;

    pa = &a;
    pb = &b;

    printf("pa가 가리키는 변수의 주소값: %p \n", pa);
    printf("pa의 주소값: %p \n", &pa);
    printf("pb가 가리키는 변수의 주소값: %p \n", pb);
    printf("pb의 주소값: %p \n", &pb);

    printf(" ------------- 호출 -------------- \n");
    pswap(&pa, &pb);
    printf(" ------------- 호출끝 -------------- \n");

    printf("pa가 가리키는 변수의 주소값: %p \n", pa);
    printf("pa의 주소값: %p \n", &pa);
    printf("pb가 가리키는 변수의 주소값: %p \n", pb);
    printf("pb의 주소값: %p \n", &pb);

    return 0;
}

int pswap(int **ppa, int **ppb) {
    int *temp = *ppa;

    printf("ppa가 가리키는 변수의 주소값: %p \n", ppa);
    printf("ppb가 가리키는 변수의 주소값: %p \n", ppb);

    *ppa = *ppb;
    *ppb = temp;

    return 0;
}

 

main 함수에서의 포인터 구조

  • int a, b;는 두 개의 정수형 변수 a와 b를 선언
  • int *pa, *pb;는 두 개의 정수형 포인터 변수 pa와 pb를 선언
  • pa = &a;는 pa가 a의 주소를 가리키도록 한다.
  • pb = &b;는 pb가 b의 주소를 가리키도록 한다.

이 시점에서:

  • pa는 a의 주소를 가리킨다.
  • pb는 b의 주소를 가리킨다.

pswap 함수 호출

pswap(&pa, &pb);는 pa와 pb의 주소를 pswap 함수에 전달한다. 따라서, pswap 함수에서:

  • ppa는 pa의 주소를 가리킨다.
  • ppb는 pb의 주소를 가리킨다.

pswap 함수 내부에서의 동작

  1. int *temp = *ppa;
    • *ppa는 pa가 가리키는 값을 의미한다. ppa는 pa의 주소를 가리키므로, *ppa는 pa의 값, 즉 a의 주소를 의미한다.
    • 따라서 temp는 a의 주소를 가리키게 된다.
  2. *ppa = *ppb;
    • *ppb는 pb가 가리키는 값을 의미한다. ppb는 pb의 주소를 가리키므로, *ppb는 pb의 값, 즉 b의 주소를 의미한다.
    • 따라서 *ppa = *ppb;는 pa가 b의 주소를 가리키도록 한다.
  3. *ppb = temp;
    • temp는 a의 주소를 가리키고 있으므로, *ppb = temp;는 pb가 a의 주소를 가리키도록 한다.

결과적으로, pswap 함수가 끝난 후:

  • pa는 b의 주소를 가리킨다.
  • pb는 a의 주소를 가리킨다.

이를 통해 pa와 pb가 가리키는 값이 서로 바뀌게 된다!

따라서, temp가 a의 주소를 가리키는 이유는 temp가 *ppa, 즉 pa가 가리키는 값을 저장하기 때문이며, 
&pa와 &a가 같은 것이 아니라, pa가 a의 주소를 가리키고 있다는 점이 중요

 

 

위 예제의 경우 타입은 int* 타입이므로, int*타입을 가리키는 포인터의 타입이 int** 이기 때문에 

int pswap(int **ppa, int **ppb)

와 같이 함수를 정의한 것

 

 

'C' 카테고리의 다른 글

[LeetCode] Two Sum  (0) 2024.11.10
함수 포인터 연습문제  (0) 2024.06.16
function  (1) 2024.06.09
포인터  (0) 2024.05.10
비트 연산  (0) 2024.05.10