포인터와 함수

SSamYang·2024년 11월 24일

https://www.youtube.com/watch?v=7Ne4rJteUwY&list=PLrj92cHmwIMeGEv1EgvJdIJwQAFzHV3k1&index=2

1. 포인터와 변수의 관계

  • 일반 변수는 메모리에 값을 저장합니다. 예: int a = 3;에서 a는 값 3을 메모리에 저장.
  • 포인터는 메모리 주소를 저장합니다. 예: int *p = &a;에서 p는 변수 a의 주소를 저장.

2. 값 전달(Call by Value)

  • 함수를 호출할 때 일반 변수를 전달하면, 함수 내부에서 해당 값의 복사본이 생성됩니다.
  • 함수 내부에서 복사본을 변경해도 원본에는 영향을 미치지 않음.
  • 예:이 경우 ab의 값은 변경되지 않음.
    void swap(int x, int y) {
        int temp = x;
        x = y;
        y = temp;
    }

3. 주소 전달(Call by Address)

  • 값을 직접 바꾸기 위해 변수의 주소를 함수에 전달.
  • 포인터를 사용해 전달받은 주소를 통해 원본 값 변경.
  • 예:호출 시 swap(&a, &b);로 주소를 전달하면, ab의 값이 실제로 교환됨.
    void swap(int *p1, int *p2) {
        int temp = *p1;
        *p1 = *p2;
        *p2 = temp;
    }

4. 포인터를 활용한 값 교환 예제

#include <stdio.h>void swap(int *p1, int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

int main() {
    int a = 3, b = 5;

    printf("Before swap: a = %d, b = %d\n", a, b);
    swap(&a, &b);
    printf("After swap: a = %d, b = %d\n", a, b);

    return 0;
}
  • 출력:
    Before swap: a = 3, b = 5
    After swap: a = 5, b = 3

5. 콜바이밸류(Call by Value) vs 콜바이어드레스(Call by Address)

  • 콜바이밸류: 복사본을 생성, 원본은 변경되지 않음.
  • 콜바이어드레스: 원본 주소를 전달하여 원본 데이터를 직접 수정 가능.

6. 포인터의 활용

  • 메모리 효율성 향상.
  • 원본 데이터의 변경.
  • 동적 메모리 관리.
  • 다양한 자료구조와 알고리즘 구현.

혼란의 이유: 포인터가 다루는 대상

  • 포인터 변수에는 주소값만 저장할 수 있습니다.
  • 하지만 포인터가 가리키는 메모리 위치의 값은 읽거나 수정할 수 있습니다. 이를 위해 ``(역참조 연산자)를 사용합니다.

따라서, *p1 = *p2;는 두 포인터가 가리키는 메모리 값을 복사하는 것이지, 포인터 변수 자체의 주소를 변경하는 것이 아닙니다.

profile
공부 기록장📕

0개의 댓글