C:Pointer&Function

aiden·2023년 4월 6일
0

C

목록 보기
14/28

Pass Array to Function

Pass Parameter

인자 전달은 어떻게 이루어질까?
값의 복사를 통해 전달된다. 함수 호출 시 전달되는 인자는 매개변수에 복사된다. 따라서 함수에 변수를 넣어 호출해도 함수 종료 후 해당 변수의 값이 변경되는 것은 아니다. 변수 자체가 전달되는 것이 아니라 변수의 값이 복사되어 전달되는 것이기 때문이다.

함수 호출 시 인자로 배열을 넘기고 싶을 때에는 어떻게 해야할까? 매개변수로 배열을 선언할 수 없어 배열은 함수의 인자로 통째로 넘길 수 없다. 대신 배열의 주소를 넘기는 방식으로 전달할 수 있다.

int arr[5] = {1, 2, 3, 4, 5};
Func(arr);

이 때 함수의 매개변수는 다음과 같이 선언한다.

int Func(int *param){
	//함수 작성
}

혹은 이렇게도 선언 가능하다.

int Func(int param[]){
	//함수 작성
}

👉🏻위와 같은 문법은 매개변수 선언 시에만 가능하다. 평소에는 저렇게 대체하여 쓸 수 없다.

Call-by-value, Call-by-reference

값에 의한 호출과 참조에 의한 호출은 매우 중요한 개념이다.

Call-by-value

함수의 호출 시 기본적으로 값에 의한 호출을 따른다. 인자를 전달할 때 값이 복사되어 매개변수에 대입된다. 따라서 변수를 함수에 인자로 전달하여 연산을 해도 리턴값을 새로 대입하지 않는 한 변수의 값이 변경되지는 않는다. 함수의 연산은 그 변수 자체가 아닌 복사된 값에만 적용되었기 때문이다.

Call-by-reference

참조에 의한 호출은 주소값을 전달하는 방식이다. 주소값을 알려주고 함수 내에서 직접 접근하므로, 함수가 종료되었을 때 함수 내에서 일어난 연산의 결과가 그대로 남아있게 된다.

scanf 함수를 호출할 때 &연산자를 사용하던 때가 있고 사용하지 않은 때가 있었다. &연산자는 변수의 주소를 반환한다. 변수에 데이터를 저장하려면 주소를 알아야하기 때문에 scanf 함수 호출 시 변수의 주소값을 전달했던 것이다.
문자열을 입력받을 때에는 &연산자를 붙이지 않았다. 문자열을 입력받을 배열의 이름을 인자로 전달했는데, 공부한 바와 같이 배열의 이름은 그 자체가 포인터이기 때문이다.

Const in Pointer

변수에 const 키워드를 붙여 상수처럼 사용하는 법에 대해 공부했었다. const 상수는 선언과 동시에 초기화를 해야하며 초기화 후 값을 변경할 수가 없었다.

포인터 변수도 const 선언을 할 수가 있는데, 그 위치에 따라 의미가 달라진다. 다음의 두 문장은 같은 선언이 아니다.

const int *ptr = # //*ptr을 통해 num 변경 불가. num은 변경 가능.
int * const ptr = # // 포인터 변수 ptr의 상수화. 한번 초기화되면 ptr은 다른 변수 가리킬 수 없음.

두 가지 const 선언을 모두 할 수도 있다.

const int * const ptr = # //*ptr로 num변경 불가&ptr은 다른 변수 가리킬 수 없음.
profile
파인애플 좋아하세요?

0개의 댓글