함수에 주소를 전달한다.라는 말은 포인터를 전달하겠다라는 말과 동일하다.
예제를 통해 보면
ex1
#include<stdio.h>
int main(void) {
int x = 10, y = 20;
printf("%d", f(&x, y));
printf("%d %d, ₩n", x, y);
}
int f(int *i, int j) {
*i += 5;
return(2 **i + ++j);
}
해설
main
x | x의 주소 | y | y의 주소 | ||
초기값 | 10 | 100번지 | 20 | 200번지 | |
*i += 5로 인해 x가 15 | 15 | 21 |
printf("%d", f(&x, y)); -> x의 주소, y의 값을 출력하라
printf("%d %d, ₩n", x, y); -> 15,21
f
i = x의 주소 | *i += 5 ( i의 값) | j = y값 | |
초기값 | 100번지 | 20 | |
10+5 = 15 | |||
return(2 * *i + ++j) | 2 * 15 + 21 | 21(++j) |
int f(int *i, int j) x의 주소, y의 값을 인자로 받는다.
*i += 5; -> i의 값 = i의 값 +5 = 10+5 = 15 -> *i는 결국 100번지의 값이므로, 100번지의 값에 15를 넣어라 -> x값이 15가 된다.
return(2 * *i + ++j); -> 호출했던 f(&x, y)에 51을 리턴하고 지역 변수는 다 사라진다.
답: 51, 15, 21
ex2
#include<stdio.h>
void main() {
int a = 5;
int b= 3;
int c = 0;
b = foo(a, &c);
c = foo(b, &a);
printf("a=%d b=%d c= %d", a, b, c);
}
int foo(int a, int *b)
int c;
*b = a + 1;
c = a -1;
return c;
}
해설
main
a | b | c | |
임의의 주소 | 100번지 | 200번지 | 300번지 |
초기값 | 5 | 3 | 0 |
*b = a+1 | 6 | ||
return c | 4 | ||
b=foo(a,&c); 종료 값 | 5 | 4 | 6 |
*b = a+1 | 5 | ||
return c | 3 | ||
최종 | 5 | 4 | 3 |
b = foo(a, &c); -> a의 값과 c의 주소인 foo(5, 300번지)로 함수 실행
c = foo(b, &a); -> b의 값과 a의 주소인 foo(4, 100번지)로 함수 실행
foo
a | b | c | |
foo(a, &c)에서 할당 받은 c의 주소인 300번지 | 300번지(&c를 참조) | ||
foo(a, &c)에서 할당 받은 a의 값 5 c = a-1 |
5 | 4 | |
초기화(함수 마치면 지역변수 초기화) | - | - | - |
foo(b, &a)에서 할당 받은 c의 주소인 300번지 | 100번지(&a를 참조) | ||
foo(b, &a)에서 할당 받은 a의 값 4 c = a-1 |
4 | 3 |
int foo(int a, int *b) -> foo(a, &c)에서 할당 받은 a의 값과 c의 주소인 5, 300번지
*b = a + 1; -> b의 값에(300번지의 값)에 a+1 값인 5+1 = 6할당 (main함수의 100번지에 할당)
c = a -1; -> c의 값에다가 a-1 값인 5-1 = 4할당
return c; -> c값을 4을 호출한 b에 할당
사용했던 지역변수는 사라진다.
int foo(int a, int *b) -> foo(b, &a)에서 할당 받은 b의 값과, a의 주소인 4,100번지
*b = a + 1; -> -> b의 값에(100번지의 값)에 a+1 값인 4+1 = 5할당 (main함수의 100번지에 할당)
c = a -1; -> c의 값에다가 a-1 값인 4-1 = 3할당
return c; -> -> c값 3을 호출한 c에 할당
printf("a=%d b=%d c= %d", a, b, c);
답: 5,4,3
이번에는 배열을 통해 함수에 주소를 전달해보자
ex3
#include<stdio.h>
void main() {
int value = 3, list[4] = {1, 3, 5, 7};
int i;
swap(value, &list[0]);
swap(list[2], &list[3]);
swap(value, &list[value]);
for(i = 0; i<4; i++)
printf("%d", list[i]);
}
void swap(int a, int *b) {
int temp;
temp = a;
a = *b;
*b = temp;
}
해설
value |
3 |
list | 1 | 3 | 5 | 7 |
100번지 | 100번지 | 101번지 | 102번지 | 103번지 |
swap(value, &list[0]); -> value의 값과, list[0] 번째의 주소 = 3, 100번지 들고 swap함수 호출
swap(list[2], &list[3]); -> list[2]의 값과, list[3]의 주소 = 5, 103번지 들고swap함수 호출
swap(value, &list[value]); -> vlaue의 값과, value의 값 '번째' list의 주소 = 3, &list[3]인 103번지 들고 swap함수 호출
호출 별 진행 하단 참조
swap
a | b | temp | ||
초기값 | 3 | 100번지 | ||
swap(value, &list[0]) | temp = a | 3 | ||
a = *b (b의 값) | 1(100번지의 값) | |||
*b = temp | b의 값에 3을 할당 (b가 참조하는 100번지의 값에 3을 할당) |
|||
초기화 | - | - | - | |
초기값 | 5 | 103번지 | ||
swap(list[2], &list[3]); | temp = a | 5 | ||
a = *b (b의 값) | 7(103번지의 값) | |||
*b = temp | b의 값에 5을 할당 (b가 참조하는 103번지의 값에 5을 할당) |
|||
초기화 | - | - | - | |
초기값 | 3 | 103번지 | ||
swap(value, &list[value]) | temp = a | 3 | ||
a = *b (b의 값) | 5(103번지의 값) | |||
*b = temp | b의 값에 3을 할당 (b가 참조하는 103번지의 값에 3을 할당) |
list | 1 | 3 | 5 | 7 |
100번지 | 100번지 | 101번지 | 102번지 | 103번지 |
/swap(value, &list[0]) *b = temp |
3 | 3 | 5 | 7 |
swap(list[2], &list[3]) | 3 | 3 | 5 | 5 |
swap(value, &list[value]) | 3 | 3 | 5 | 3 |
for(i = 0; i<4; i++)
printf("%d", list[i]);
for문을 풀어보면 i=0부터 3까지 list에 있는 값을 출력해라
list[0], list[1], list[2], list[3] 의 값은 최종적으로
3353이기 때문에
답 3353
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 함수가 주소를 리턴하는 경우. (0) | 2022.06.22 |
---|---|
[정보처리기사] C언어 - 함수와 변수의 유효범위 (0) | 2022.06.21 |
[정보처리기사] C언어 - 함수, 반복문 예제 (0) | 2022.06.21 |
[정보처리기사] C언어 - 함수의 기본 (swap함수 예제) (0) | 2022.06.20 |
[정보처리기사] C언어 - 배열 포인터 (0) | 2022.06.20 |