본문 바로가기
깨알 c언어

깨알 c언어 ch.41 ~ 45

by moca7 2024. 3. 10.

41. 함수에 주소전달(2)

42. 함수에 주소전달(3)

43. 함수가 주소를 리턴

44. 함수에 주소전달(4)

45. 함수에 주소전달(5)

 

 

 

41. 함수에 주소전달(2)

 

ㅁ 문제

 

- 각각의 함수 안에 변수들이 있음. 지역변수가 각각. 

- main에 a=5, b=3, c=0

a의 주소값 100, b의 주소값 200, c의 주소값 300

 

- b=foo(a, &c);     

함수 foo의 지역변수

a = 5, b = 300번지

c 선언

b의 실제값을 6으로 바꿈. => main의 c 값이 6이 됨.

c=4

리턴 4.

main의 지역변수가 a=5, b=4, c=6이 됨.

 

- c=foo(b, &a);

함수 foo의 지역변수

a = 4, b = 100번지 (a에는 4라는 값이 들어가게 되는거고 b라는 공간엔 100이라는 주소값이 들어감)

c 선언

b의 실제값을 5로 바꿈. => main의 a 값이 5가 됨.

c = 3

리턴 3.

main의 지역변수가 a=5, b=4, c=3이 됨. 

 

- 출력결과

a=5, b=4, c=3

 

 

42. 함수에 주소전달(3)

 

ㅁ 문제

 

- swap( value, &list[0] );

       100번지 101번지 102번지 103번지

list        1              3            5             7                     <- list가 가지고 있는 값은 100번지

 

swap함수.

a=3, b는 100번지가 들어감.

temp 선언

temp = 3

a= 100번지의 실제값인 1

b의 실제값=3        <- list 변경 

함수종료. swap 함수 내의 a, *b, temp 전부 사라짐.

 

       100번지 101번지 102번지 103번지

list        3              3            5             7

 

- swap( list[2], &list[3] );

swap함수.

a=5, b는 103번지가 들어감.

temp 선언

temp = 5

a= 103번지의 실제값인 7

b의 실제값=5      <- list 변경

함수종료. swap 함수 내의 a, *b, temp 전부 사라짐.

 

       100번지 101번지 102번지 103번지

list        3              3            5             5

 

- swap( value, &list[value] );

swap함수.

a=3, b는 103번지가 들어감.

temp 선언

temp = 3

a= 103번지의 실제값인 5

b의 실제값=3       <- list 변경

함수종료. swap 함수 내의 a, *b, temp 전부 사라짐.

 

       100번지 101번지 102번지 103번지

list        3              3            5            3

 

- for( i=0, i<4, i++)

      printf("%d", list[i]);

- 출력결과. 3353 

 

 

43. 함수가 주소를 리턴

 

ㅁ 

- 리턴하는 방식이 int(값)일 수도 있는거고 주소값이 될 수도 있음.

 

ㅁ 문제

 

- for( i=0; i <100; i++ )

     a[i] = i * 10;

 

a[0]=0, a[1]=10, a[2]=20 ... a[99]=990

 

- p = func(x, a);

포인터변수 func.        <- int *func()함수에 *이 없으면 오류 발생. 

                                       *은 함수가 값이 아닌 주소값을 리턴한다는 의미.

                                       리턴을 할때 int의 주소값을 리턴하게 된다.

 

a=10, x의 주소값에는 100번지가 들어감.

a=20;

x의 주소값은 101이됨.

x의 실제값(101번지의 실제값)은 101번지의 실제값 x 2 = 20이 됨.

 

a[0]=0, a[1]=20, a[2]=20 ... a[99]=990

 

101번지를 리턴함. p=101번지

 

- printf("sum=%d", x + a[0] + a[1] + p[0] + p[1]);

 

101 + 0 + 20 + 20 + 30 = 171

sum= 171

1) 함수 *func의 x=101번지는 함수 종료와 함께 사라짐. 여기서 x는 main의 10.

2) p[1]이 102번지인데 20다음이라고 30이 아님. 20다음 20임. 

 

- 출력결과.

10 + 0 + 20 + 20 + 20 = 70

 

 

44. 함수에 주소전달(4)

 

ㅁ 문제

 

-

100번지 200번지 300번지 400번지

     a           b             c             d

    10          20          30            40

 

- change함수

포인터변수 px는 100번지, 포인터변수 py는 200번지, pc=30, pd=40이 들어감.

 

100번지의 실제값은 20+40 = 60이 됨.

200번지의 실제값은 30+40 = 70이 됨.

pc = 60 + 40 = 100, pd = 60 + 70 = 130. 

함수종료. 싹 사라짐.

 

- a=60, b=70, c=30, d=40

 

 

45. 함수에 주소전달(5)

 

ㅁ 문제

 

- double이라는 형태의 f라는 배열을 만듦.

- f라는 배열 첨자는 100번지 주소값을 가짐

- 3.1f

3개의 공간을 만들어 놓고 소수점 한자리만 출력

 

- h함수

포인터변수 f의 주소값은 100번지, d=4, x=2.0

i 선언, res=0.0

 

- 반복문

1) i=3

res= 0.0 x 2.0 + 4.0 = 4.0

2) i=2

res= 4.0 x 2.0 + 3.0 = 11.0

3) i=1

res= 11.0 x 2.0 + 2.0 = 24.0

4) i=0

res= 24.0 x 2.0 + 1.0 = 49.0

이후 i는 -1이 되고 반복문 조건을 만족시키지 못해 반복문 종료. res 리턴. 함수 종료.

 

- 출력결과.

49.0

 

Q. 답이 49.0이면 ㅁㅁㅁㅁ 4칸이 필요한것 아닌가요?

A. 네 4칸이 필요한데, 칸이 모자랄 때는 그냥 뒤에 있는 .1f만 처리를 하게 됩니다.

정수부분은 다 나오게하고, 소수점은 한자리만 표현하게 됩니다.

예를 들어, printf("%3.1f". 149.53);이면

149.5 이렇게 출력됩니다.

 

- 소수점도 칸 수에 포함이 됩니다. 

 

- 실수형 변수 res. 0과 0.0은 푸는 과정에서 큰 의미 없음. 출력할 때 출력형식에만 맞춰서 표현하면 됨.

 

- 배열값을 가지고 포인터에 넘겼을 때, 그 포인터도 배열처럼 사용할 수 있다.

이전에 공부했듯이. 

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.51 ~ 55  (0) 2024.03.11
깨알 c언어 ch.46 ~ 50  (0) 2024.03.10
깨알 c언어 ch.36 ~ 40  (0) 2024.03.09
깨알 c언어 ch.31 ~ 35  (0) 2024.03.08
깨알 c언어 ch.26 ~ 30  (0) 2024.03.08