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 |