2번
이러면 답이 zzz가 나옴. 약간 값에 의한 전달 처럼 된거라 set_pointer에서 값을 바꿔도 수정이 일어나지 않음
const char* p를 하긴 했지만 이건 엄밀히 말하면 char형 포인터가 아니라 그냥 char형 문자열 선언이랑 똑같음
만약에 참조에 의한 전달을 하려면 진짜 주소값 쓰려면
이미 포인터인 p의 주소값을 인자로 전달하고 매개변수에는 이중포인터를 쓰면 진짜 참조에 의한 전달이된다.
3번,9번 다시 풀어보기!
11번
최소공배수를 알아내는 방법이 두가지 있는데
1. 유클리드
2. static을 통해 누적된 값을 이용해 최소공배수를 구하는 방법이 있다.
둘다 재귀를 쓴다는 점에서 공통점이 있다!
우선 유클리드 부터
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include<stdio.h>
#include<limits.h>
int lcm(int a, int b) {
int A = a;
int B = b;
//무조건 a가 더 커야함
if (a < b) {
int temp = b;
b = a;
a = temp;
}
while (true) {
if (a == b) {
return a;
}
else {
if (a > b) {
a -= b;
return lcm(a, b);
}
else {
b -= a;
return lcm(a, b);
}
}
}
}
int main() {
int a = 5;
int b = 2;
printf("%d\n", a*b*lcm(a,b));
}
|
cs |
static을 이용해서
static은 프로그램이 시작될때만 초기화되니까 함수가 다시 실행되도 인덱스값에 해당하는 i와 product는 계속 누적될 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include<stdio.h>
#include<limits.h>
int F(int a, int b) {
static int product = 0;
static int i = 0;
if (i < a) {
product = product + b;
i++;
F(a, b);
}
return product;
}
int main() {
printf("%d", F(5, 8));
}
|
cs |
만약에 재귀를 쓰지 않고 반복문만 써야 한다면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
int main() {
int a = 4;
int b = 12;
int min = 0;
int gcdVal = 0;
if (a < b) {
min = a;
}
else {
min = b;
}
for (int i = 1; i <= min; i++) {
if (a % i == 0 && b % i == 0) {
gcdVal = i; //break를 안걸어야 가장 마지막 값이 최대공약수로 나옴
}
}
//공약수 구하기
for (int i = 1; i <= gcdVal; i++) {
if (gcdVal % i == 0) {
printf("%d ", i);
}
}
printf("\n");
printf("최대공약수 = %d\n",gcdVal);
printf("최소공배수 = %d",gcdVal*(a/gcdVal)*(b/gcdVal));
}
|
cs |
16번
주의하자. if문 안에 num은 새로운 저장공간을 가지고 있는 num이다! 즉 17 1이 출력됨!
17번
swap함수 주의점
포인터 매개변수로 받아와도
int* temp=a;
*a=*b;
*b= *temp; 해서 역참조를 해야 바뀌지
여기 출력값은
10 20
20 10
역참조 안하고
a=b;
b=temp;하면 안바뀐다.!!
여기 출력값은
10 20
10 20
swap이 안된다! 왜냐면 p1,p2변수는 SwapIntPtr 함수가 끝날때 변수들이 사라지기 때문이다!
19번
포인터배열.. 여전히 헷갈린다...
포인터 배열 ptrArr에는 {&num1,&num2,&num3} 가 들어있다.
*(ptrArr[0]) 은 *(&num1)이고 이는 num1이다.
*(dptr[0])은 무엇일까?
첫번째 생각은 dptr이 ptrArr이기에 dptr을 ptrArr로 치환해서 *(ptrArr[0]) == *(&num1)으로 보는 방법이 있다.
두번째 생각은 *(*(dptr+0)) 로 보는 것이다.
dptr은 &ptrArr[0]이다.
*(*(&ptrArr[0])) == *ptrArr[0]
*(dptr[1]) 도 생각해보자.
*(*(dptr+1)) == *(*(&ptrArr[0]+1)))
여기서 생각해야 하는건 arr+i == &(arr[i]) 라는 공식!
ptrArr== &ptrArr= &ptrArr[0]
*(*(ptrArr+1)) == *(*(&ptrArr[1])) == *(ptrArr[1])
'C > 기말고사 대비(2022 1학기)' 카테고리의 다른 글
[C언어 시험대비] 오름차순,내림차순 for문으로 구현 (0) | 2022.06.13 |
---|---|
[C언어 시험대비] srand (0) | 2022.06.12 |
[C언어 시험대비] 2020년 기말고사 기출 (0) | 2022.06.11 |
[C언어 시험대비] 2016년 기말고사 기출(3) (0) | 2022.06.11 |
[C언어 시험대비] 배열포인터 (0) | 2022.06.11 |
댓글