iOS/정보처리기사

[정보처리기사] C언어 - 함수에 주소를 전달하는 예제1

Chafle 2022. 6. 21. 21:31
반응형

함수에 주소를 전달한다.라는 말은 포인터를 전달하겠다라는 말과 동일하다.

 

 

 

예제를 통해 보면

 

 

 

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 

반응형