함수에서 인자를 포인터로 받으면 무조건 원본 변경이 될까?

2023. 5. 17. 18:23·C프로그래밍/개인 공부

포인터를 활용하면 '원본의 변경'을 할 수 있다. 라고 배운다.

하지만, 변경이 안되는 헷갈리는 부분이 있어서 글로 남긴다.

 

#include <stdio.h>

void PointerChange(int *pointer) {
    pointer = pointer + 10; //주소 자체를 변경
}

int main(void) {
    int a = 10;
    int *p = &a;

    printf("a = %d\n", a);
    printf("p가 가리키는 주소 = %u\n", p);

    PointerChange(p);
    printf("p가 가리키는 주소 = %u\n", p);

    return 0;
}

변수 a = 10이고 포인터 변수 p 는 a를 가리키고 있다.

PointerChange함수는 매개변수로 포인터 변수를 받고, 받은 포인터 변수를 10증가시킨다.

그리고 다시 p의 주소가 증가 되었는지 확인한다.

 

확인을 해보면,

p가 증가하지 않았다.


Why?

포인터 매개변수를 변경한다는건 가리키고 있는 주소를 변경한다는 의미이다.

하지만 이것은 불가능하다.

void PointerChange(int *pointer) {
    pointer = pointer + 10; //주소 자체를 변경
}

여기서 인자로 포인터p를 전달하면, 함수 안에서 포인터 p가 복사되어 그 복사본인 포인터 변수 pointer를 변경하기 때문이다.

즉, 복사된 것을 변경해봤자 원본인 p는 변경되지 않는것이다.

 

무작정 함수에서 매개변수를 포인터로 주면 원본이 변경된다! 라고 외운 초보자들이라면 실수하기 쉬운 부분이다.


But

포인터가 가리키고 있는 주소의 데이터 값을 변경시키는 것은 가능하다.

PointerChange함수를 이렇게 변경해보자

void PointerChange(int *pointer) {
    *pointer = 15;
}

이것은 포인터가 가리키는 주소에 있는 데이터를 바꾸는 것이기 때문이다.


요약하자면,

함수의 매개변수로 포인터를 전달 했을 때, 그 포인터가 가리키는 주소에 있는 데이터를 변경하는 것은 '원본 변경'이 가능하다.

하지만, 포인터가 가리키는 주소를 변경하는 것은 불가능하다(투 포인터를 사용하면 가능하긴함). 왜냐면 함수에서는 매개변수가 '복사'되어 사용되기 때문이다.

 

'C프로그래밍 > 개인 공부' 카테고리의 다른 글

arm맥북에서 x64dbg사용하기  (0) 2025.09.17
2차원 배열 포인터 형으로 함수 인자로 전달하기  (0) 2023.02.12
C언어 - 함수의 포인터  (0) 2023.01.07
C언어 - 포인터의 배열, 배열의 포인터  (0) 2023.01.05
C언어 - 이중 포인터  (0) 2023.01.03
'C프로그래밍/개인 공부' 카테고리의 다른 글
  • arm맥북에서 x64dbg사용하기
  • 2차원 배열 포인터 형으로 함수 인자로 전달하기
  • C언어 - 함수의 포인터
  • C언어 - 포인터의 배열, 배열의 포인터
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    Git
    순환
    commit
    리눅스
    커널
    INIT
    이진 트리
    arm
    자료구조
    스택
    Branch
    피보나치
    rubikpi3
    버퍼
    드라이버 분석
    앤드류모튼
    시스템콜
    동적메모리
    rubik pi
    토발즈
    소수
    커널 기여
    포인터
    yolo
    백준
    파일 입출력
    c언어
    Qualcomm
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
함수에서 인자를 포인터로 받으면 무조건 원본 변경이 될까?
상단으로

티스토리툴바