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
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - STATIC변수 (0) | 2022.06.23 |
---|---|
[정보처리기사] C언어 - 함수에 주소를 전달하는 예제3 (2) | 2022.06.22 |
[정보처리기사] C언어 - 함수가 주소를 리턴하는 경우. (0) | 2022.06.22 |
[정보처리기사] C언어 - 함수와 변수의 유효범위 (0) | 2022.06.21 |
[정보처리기사] C언어 - 함수에 주소를 전달하는 예제1 (0) | 2022.06.21 |