1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
void func(char *d, char *s) {
while (*s) {
*d = *s;
d++;
s++;
}
*d = '\0';
}
int main() {
char* str1 = "first";
char str2[50] = "teststring";
int result = 0;
func(str2, str1);
for (int i = 0; str2[i] != '\0'; i++) {
result += i;
}
printf("%d\n", result);
return 0;
}
|
cs |
2024년 7월에 시행된 정보처리기사 기출문제다.
먼저 func() 함수 부분을 살펴보자
두 정수형 char 변수를 각각 d와 s라는 포인터 변수로 전달받고,
s가 갖는 문자열의 주소가 가리키는 문자가 \0 가 되기 전까지 반복한다.
반복문은 d의 주소가 가리키는 문자를 s의 주소가 가리키는 문자로 교체한다.
그리고 d와 s의 주소를 한칸씩 이동시킨다.
반복문이 종료되면 d의 주소가 가리키는 문자를 \0 로 교체한다.
흐름으로 보았을때, d의 값을 s와 동일하게 만드는것같다.
그다음 main() 함수 부분을 살펴보자
포인터변수 str1에 "first" 문자열을 저장했고,
str2[50]에 "teststring" 문자열을 저장했다.
그리고 func(str2, str1); 호출을 통해 func() 함수에 인수를 전달하게된다.
이때, str2는 &str2[0]를 의미하며, str1은 "first"라는 문자열 리터럴의 첫 번째 문자를 가리키는 포인터 변수이다.
char* str1 = "first"; 이것은 str1이라는 포인터변수에 "first"를 저장했다 라고 해석하는것은 사실 적절하지 않고,
포인터변수 str1은 "first"라는 문자열의 시작주소를 가리키는것이라고 해석하는것이 적절하다.즉, str1은 &str1[0]을 의미하게된다.
그렇다면 다시 func() 함수로 넘어가보자
func() 함수는 &str2[0], &str1[0] 인수를 전달받았다.
문자열의 주소에 접근하여 실제로 값을 변경할 수 있게되었다.
이것을 「Call by Reference(참조에 의한 호출)」 라고 한다.
그 다음 반복문을 살펴보면
while (*s) 여기에서 *s는 매개변수로 전달받은 &str1[0]을 역참조하여 str1[0]의 값을 의미한다.
즉, s가 가리키는 주소에 저장된 값을 의미하며, 해당 값이 \0 이 되면 반복문이 종료된다.
반복문은 str1[0]의 값인 "f" 부터 시작하여 다음과 같은 순서대로 진행된다.
f → i → r → s → t → \0(종료)
그리고 각 단계마다 d가 가리키는 주소에 저장된 값을 해당 문자로 교체하게된다.
d는 "teststring" 문자열을 갖고있으니,
먼저 t 를 f로 교체하고 d와 s가 가리키는 주소를 한 칸 씩 이동하면 *d는 e를 가리키게되고, *s는 i를 가리키게된다.
그러면 다음으로 e 를 i로 교체하고 또 반복하여 d와 s가 가리키는 주소를 한 칸 씩 이동하면 *d는 s를 가리키게되고, *s는 r를 가리키게된다.
이 과정을 반복하면 d는 결국 firsttring이 될것이다.
하지만, 반복문이 종료되고 *d = '\0'; 에 의해 *d가 마지막으로 가리키고있던 값인 first 다음에 이어지는 t를 \0으로 교체하게된다. 그렇게되면 해당 문자열은 \0을 마지막으로 뒤의 문자들은 삭제된다.
즉, d는 최종적으로 s와 동일한 first가 된다.
다시 main() 함수로 넘어가보자.
result는 0으로 초기화됐고,
for반복문은 str2 문자열의 마지막 \0 이 나오기 전까지 result에 i값을 누적시키는 행위를 반복하게된다.
i=0, result=0 // str[0]="f"
i=1, result=1 // str[1]="i"
i=2, result=3 // str[2]="r"
i=3, result=6 // str[3]="s"
i=4, result=10 // str[4]="t"
즉, 실행 결과는 10
'정보처리기사 > C' 카테고리의 다른 글
[C] Call by Value 문제 분석(24년7월 기출) (0) | 2025.02.13 |
---|