iOS/정보처리기사

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

Chafle 2022. 6. 22. 22:05
반응형

 

ex1

 

#include<stdio.h>

void main(void) {

int a = 10, b = 20, c = 30, d = 40;

change(&a, &b, c, d);

printf("a = %d, b= %d, c = %d, d = %d, a,b,c,d);

}

 

void change(int *px, int *py, int pc, int pd) {

*px = *py + pd;

*py = pc + pd;

pc = *px + pd;

pd = *px + *py;

}

 

 

 

해설

 

초기값 a b c d
임의의 주소 100번지 200번지 300번지 400번지
주소값 10 20 30 40

 

change(&a, &b, c, d); -> 100번지 200번지, 30, 40 값을 들고 함수로 넘어간다

 

 

void change(int *px, int *py, int pc, int pd)

*px = *py + pd; -> px주소값 =  py의 주소값 + pd의 값 -> 200번지의 값 + 40 = 20+40 = 60 을 px가 참조하는 100번지의 값에 대입

*py = pc + pd; -> py주소값 = pc값 + pd값 -> 30+40 = 70을 py가 참조하는 200번지에 대입

pc = *px + pd; -> pc값 = px값 + pd값 -> 60+40 = 100을 pc에 대입

pd = *px + *py; -> pd값 = px주소값 + py주소값 -> 60 + 70 = 130을 pd에 대입

 

  px py pc pd
초기값 100번지 200번지 30 40
pc = *px + pd     100  
pd = *px + *py       130
함수 마치면 초기화 - - - -

 

초기값 a b c d
임의의 주소 100번지 200번지 300번지 400번지
주소값 10 20 30 40
*px = *py + pd 60      
*py = pc + pd;   70    
최종 60 70 30 40

 

printf("a = %d, b= %d, c = %d, d = %d, a,b,c,d);

 

답 60, 70, 30, 40

 

 


 

 

ex2

 

#include<stdio.h>

int main() {

double f[] = {1,2,3,4};

printf("%3.1f₩n", h(f, 4, 2));

return 0;

}

 

double h(double *f, int d, double x) {

int i;

double res = 0.0;

for(i = d-1; i >= 0; i--){

   res = res *x + f[i];

}

return res;

}

 

 

 

해설

 

 

double

f 100번지 101번지 102번지 103번지
100번지 1 2 3 4

printf("%3.1f₩n", h(f, 4, 2)); -> 공간 세 개 만들어 놓고 소숫점 첫째 자리까지 -> f값인 100번지, 4, 2를 들고 함수 h호출

 

 

h

  f d x
초기값 100번지 4 2

 

for문

  i(d-1) i >= 0 res * x + f[i] res i--
초기값 3     0.0  
  3 3>=0 참 -> for문 수행 0.0 * 2 + 4 = 4.0 (f[3] = 4) 4.0 2
  2 2>=0 참 -> for문 수행 4.0 * 2 + 3 = 11.0 (f[2]= 3) 11.0 1
  1 1>=0 참 -> for문 수행 11.0 * 2 + 2 = 24.0(f[1] = 2) 24.0 0
  0 0>=0참 -> for문 수행 24.0 * 2 + 1 = 49.0(f[0] = 1) 49.0 -1
  -1 -1>=0 거짓 -> for문 빠져나옴      

 

return res; = 49.0을 호출한 h에 리턴시킨다.

 

printf("%3.1f₩n", h(f, 4, 2))

 

답 = 49.0

 

 

** 세 칸을 만들고 소수점까지 표현을 한자리 까지 표현하려면, 사실 네 칸이 필요하다.

 

4 9 . 0

이런식으로 4칸이 필요한데

 

 

.1f도 역시 무조건 표현을 해야하기 때문에 모자랄 때는

최대한 표현하고 위의 결과값처럼 소수점 한 자리만 표현해 주면 된다.

 

 

 


ex3

 

#include<stdio.h>

int main() {

int a, b, c[1];

a = 20;

b = 20;

c[0] = 20;

func(&a, b, c);

printf("a=%d b=%d c=%d", a, b. c[0]);

return 0

}

 

void func(int *a, int b, int *c) {

int x;

x = *a;

*a = x++;

x = b;

b = ++x;

--(*c);

}

 

 

 

해설

  a b
임의의 주소 100번지 200번지
초기값 20 20

 

  c
임의의 번지 300번지
주소값 20

 

 

func(&a, b, c); -> 100번지, 20, 300번지 들고 func호출한다.

 

 

****c 는 c의 값인 20을 들고 가는 것이 아니고, 배열은 주소값을 들고 간다.!!!!!!!!!!!!!!

 

 

x = *a; -> x에 a의 값을 전달 = 100번지가 참조하는 값 -> 20

*a = x++; -> a의 값에 x++값을  전달 = a의 값에 x++ -> 20 할당하고 x값 20->21

x = b; -> x에 b할당 -> 20을 다시 x에 할당

b = ++x; -> b에 ++x할당 -> 먼저 20->21을 증가시키고 b에 할당 (전역변수 b에 넣을 것이 아니고, 함수 내에서 정의 한 것이니, 지역변수 b에 할당해야함!!!!! )

--(*c); -> c의 값을 먼저 --연산 후 c에 할당  -> 20->19를 300번지의 값에 19 할당

 

  *a b *c x
초기값 100번지 20 300번지  
        20
(*a = x++;)       20-> 21
x = b       20
b = ++x   21    
함수 다 쓰면 초기화 - - - -
  a b
임의의 주소 100번지 200번지
초기값 20 20
*a = x++; 20  
최종 20 20

 

  c
임의의 번지 300번지
주소값 20
--(*c) 19

 

 

printf("a=%d b=%d c=%d", a, b. c[0]);

a = 20, b = 20, c = 19

 

 

 

 

 

 

 

반응형