[C] 함수로 전달된 포인터

포인터를 함수의 인자로 받는 경우, 함수내에서 원본을 변경하는가.

내용이 너무 두서 없어서 포스트 전체를 수정합니다.

처음 의문이 든 부분은, 문자열을 가리키는 포인터를 함수로 넘겨주고 문자열을 변형하면 포인터의 값이 변하는가?라는것이었는데. 이는 사실 그리 어려운 문제가 아니다. 포인터는 메모리의 주소를 가리키는 타입의 변수이고 이는 사실 unsigned int 나 unsinged int64 등의 정수형과 비슷하게 숫자를(메모리 번지도 결국 숫자값이므로) 담는 변수이다.

그리고 함수에 선언된 인자는 함수 내부에서만 사용하는 지역변수이고, 표준 타입의 변수를 함수에 전달하면 그 값이 인자로 선언한 변수에 들어가는데, 이건 그냥 변수의 값이 인자에도 들어가는 것이므로 값이 복사되는 것이다. 따라서,

  • 함수 외부에서 특정한 구조체나 배열, 문자열에 대한 포인터를 저장한 변수 A가 있고 이를 함수의 인자로 넘기면
  • 함수의 인자 B는 A와 동일한 값을 갖는다. 다만 값이 같을 뿐, B가 A를 가리키는 포인터가 될 수는 없다.
  • A가 포인터라면 B도 포인터이므로, 이 포인터가 가리키는 곳의 값을 조작할 수는 있다. 이러한 조작은 함수의 종료 후에도 변경을 유지하게 된다.
  • B는 A의 사본으로서, 함수의 실행 중에만 유지되고 함수 실행 종료시점에 파괴된다. A에 들어있는 값 자체는 아무런 영향을 받지 않는다.

로 정리할 수 있겠다. 땅땅땅.

  • 나그네

    1.함수원형이 void func(char* buffer) 로 가정하고
    호출하는 쪽의 포인터는 char* data; 인 포인터 변수를 func(data) 로 넘기면 func함수안에서 내용도 바뀌지요.
    2. 만약 void func( int num) 이고
    호출하는 쪽의 포인터가 int* data; 인 포인터 변수를 func(*data)로 호출하면 func함수에서는 전달 인수를 복사하게 됩니다.

    파란색의 정리한 내용이 혼동을 줄 수 있어 댓글 남깁니다.
    글쓴님께서 정리한 것과 같은 경우는 제가 기술한 2번의 경우에 한정됩니다.

    • 넘겨주는 값이 무엇이든 간에, 실제로 함수에 전달되는 값은 “복사된” 값이 넘어갑니다. 이 글은 “이 때 실제 넘겨진 값”이 무엇이든 그것이 복사된 값이라는 의미입니다.

      1. void func(char* buffer)의 경우에 파라미터는 `char 포인터` 타입이 됩니다. 즉 그 자체가 이미 포인터이고, 함수로 넘겨지는 것은 문자열의 내용이 아닌 문자열의 시작번지이며, 함수 내부에서 `buffer`는 같은 주소 값이 복사된 포인터입니다. 물론 넘겨받은 값은 포인터이므로, 이를 조작해서 원래 문자열을 변경하는 것도 가능하지요.

      2. 두 번째의 경우에도 명백하게 넘겨지는 것이 “int 포인터형이 가리키는 곳의 값”이고, 이 값은 복사됩니다. 이 때는 포인터가 아닌 실제 정수값이 복사되어 넘겨집니다. 포인터가 아니므로 원래 변수의 값은 함수 내부에서 조작할 수 없습니다.

    • 글을 새로 하나 작성했습니다. 아마 다음 글이 조금 더 명확하지 않을까 싶네요. http://soooprmx.com/wp/archives/5188

  • Pingback: [C] 함수 호출 시 파라미터는 어떻게 전달되나? | Wireframe()