C언어는 빛과 소금과 진리^^
우선 다음과 같은 문제를 풀어보자! 정답은? 과연 두구두구두구두구…
#include <stdio.h>
int pointfunc (char *);
int main() {
char* p1 = "20210107";
char* p2 = "20221008";
int n = pointfunc(p1);
int m = pointfunc(p2);
printf("%d", n+m);
}
int pointfunc (char* p) {
int count = 0;
while (*p != '#include <stdio.h>
int pointfunc (char *);
int main() {
char* p1 = "20210107";
char* p2 = "20221008";
int n = pointfunc(p1);
int m = pointfunc(p2);
printf("%d", n+m);
}
int pointfunc (char* p) {
int count = 0;
while (*p != '\0') {
count ++;
p ++;
}
return count;
}
') {
count ++;
p ++;
}
return count;
}
여기에서 괴상망측한 * 라는 표시가 있다. 이 표시에 대해서 교수님이 포인터 개념에 대해 한 주 수업 시간 내내 설명하시고 폭탄 과제를 잔뜩 내 주신 게 떠오른다. 그 이후로 난 저 * 만 보면 😣 … 인데 C언어 에서는 상당히 중요한 개념이다.
예전에 삐뚤새뚤하게 포인터 개념에 대해서 정리해서 과제를 제출했다. 모범생 타입답게 제출 시각에 딱! 맞춰서 부랴부랴! 제출했다😎
“c언어는 python과 다르게 데이터 타입을 반드시 적어주어야 한다. 변수 개념은 포인터 개념과 밀접하게 관련이 있는데, 변수의 값, 변수의 주소에 대해서 c언어가 매우 민감하기 때문이다. 포인터는 변수의 값을 찍는 게 아니라 주소를 알려준다. 역참조는 주소 안의 값이 무엇인지 대신 반환해주는 것이다. 이 포인터 개념은 C언어에서 중요하게 여기는 개념이다” – summerorange 과제 제출
저 코드의 정답은 저 character 변수의 갯수를 더하면 된다. 갯수를 더하는 걸 코드로 표현한 거니까.
표로 표현하면 이런 느낌?
p | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Null |
*p | 2 | 0 | 2 | 1 | 0 | 1 | 0 | 7 | \0 |
count | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
\0이 아닐 때까지, 즉 null 값이 아닐 때까지 카운트를 하는 거니 char* p1 = “20210107”; 은 총 count 8이 나온다. 그래서 int n = 8 로 할당되고,
p | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Null |
*p | 2 | 0 | 2 | 2 | 1 | 0 | 0 | 8 | \0 |
count | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
\0이 아닐 때까지인 char* p2 =”20221008″;은 해당 pointfunc 함수 리턴값인 int m = 8이 나와서
합한 값은 8 + 8 = 16이 나오게 된다.
그리고 추가 문제가 더 있어서 추가 포스팅을 하겠다.
개념 이해에는 문제를 많이 풀어보는 게 좋은 것 같다.