본문 바로가기

C

[5] 함수와 배열인수

728x90

함수에 배열을 인수로 전달하는 방법은 2가지가 있습니다.

1. 인수를 배열로 받기

2. 인수를 포인터로 받기

 

1. 인수를 배열로 받기

함수는 배열을 인수로 받을 수 있습니다.

배열이름 test를 함수에 전달했고, 함수에서 t[ ]로 포인터로 받았습니다.

이렇게하면, 함수 내에서 t[0], t[1],... 같이 각 요소를 쓸 수 있습니다.

 

2. 인수를 포인터로 받기

함수에서 인수를 받을 때 포인터로도 받을 수 있습니다.

밑줄 친 것과 같이 함수에서 인수를 받을 때, 배열 대신 포인터로 받았습니다. 이전과 마찬가지로 배열의 이름으로 첫번째 주소값을 넘깁니다.

배열의 요소에 접근할 때 배열과 인덱스를 사용하는 대신에 포인터의 역참조를 사용합니다.

역참조를 할 때 포인터에 덧셈을 했습니다. 이것은 어떤 의미일까요?

 

포인터 연산

p+1 p가 지시하는 요소의 다음 요소의 주소를 얻는다.
p-1 p가 지시하는 요소의 이전 요소의 주소를 얻는다.
p1 - p2 p1과 p2 사이의 요소 수를 얻는다.(p1,p2는 각각 다른 포인터)
p++ p+1과 같다.
p-- p-1과 같다.

포인터에 수를 더하거나 빼면 배열에서 해당 수만큼 이동한 요소의 주소에 접근할 수 있습니다.

 

만약 배열이름 대신 첫번째 배열의 주소 자체를 넘기면 배열이름을 넘긴것과 똑같이 작동할까?

만약 함수에 인수를 넘길 때 배열이름이 아닌 요소의 첫번째 주소를 넘기면 위의 코드들과 똑같이 작동할까요?

실제로 해본 결과, 결과가 같다는 사실을 알 수 있었습니다.

test와 &test[0]는 같은 값이기 때문입니다.

 

포인터와 [ ](첨자연산자)

함수에서 인수를 포인터로 받았을 때, 포인터와 [ ]를 사용해서 각 요소에 접근할 수 있습니다.

이렇게 포인터에 [ ]를 사용하는 것은 배열과 포인터가 밀접한 관계일 때만 할 수 있습니다. 예를들어, 배열의 주소가 인수로 전달되어 포인터에 저장되는 경우입니다. 아무때나 포인터에 배열 인덱스를 사용할 수는 없습니다.

 

test[0]의 값은 다음과 동일합니다.

1. t[0](배열 형태로 인수를 받은 경우)

2. *(pT)

3. pT[0]

 

 

이상으로 1칠판 설명을 마치겠습니다.

728x90

'C' 카테고리의 다른 글

[7] 함수 포인터  (0) 2021.04.24
[6] 문자열과 포인터  (0) 2021.04.24
[4] 이중 포인터(포인터의 포인터)  (0) 2021.04.23
[3] 배열과 포인터의 관계  (0) 2021.04.22
[2] 인수와 포인터  (0) 2021.04.22