1. 들어가며
오래 전에 비트교육센터에서 C 언어 한 달 코스 강의를 들었습니다.
다른 부분은 이해가 되었지만 포인터는 알송 달송했습니다. C++ 위주의 2개월 강의도 들었는데 포인터는 여전히 이해가 충분하지 않은 상태였습니다.
그 뒤에 Java 위주의 6개월 과정에서 접한 포인터가 없는 Java 는 C나 C++ 에 배해 식은 죽 먹기처럼 쉬운 언어였습니다.
몇 년의 Java 개발자 실무 후에는 데이터 분야에서 쭈욱 일을 해왔습니다.
어쩌다 보니 정보처리기사 시험을 준비하게 되었고, 그 어렵던 포인터 이해에 다시 도전해봅니다.
2. 문제
정보처리기사 필기 2022년 3월 5일 기출 62번 문제입니다.
3. 정답
8, 9
4 궁금한 것
문제에서 제시된 코드를 보면 머리가 아픕니다. 그것을 좀 더 구체적으로 정리해 보면 다음과 같습니다.
- arr[2][3] 에 어떻게 {1,2,3,4,5,6} 을 할당하고 있을까
- int (*p)[3] 이 무슨 의미일까
- p=arr 어떤 의미일까. p 와 arr 이 어려우니 p 에 arr 을 할당하는 것은 이해가 안 될 수밖에
- *(p[0]+1) *(p[1]+2) *(p[0]+1) *(p[1]+2)) 각각에 어떤 값이 들어가 있는 것인가
5. 궁금한 것 연구 및 풀이
직접 테스트를 해보고 싶은 분들은 아래 코드를 복사해서 활용하세요.
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
//int arr[2][3] = {1,2,3,4,5,6};
int arr[2][3] = {{1,2,3},{4,5,6}};
int (*p)[3] = NULL;
p = arr;
int test01 = *(p[0]+1);
int test12 = *(p[1]+2);
printf("%d, ", *(p[0]+1) + *(p[1]+2));
int test10 = *(p[1]+0);
int test11 = *(p[1]+1);
printf("%d", *(*(p+1)+0) + *(*(p+1)+1));
return 0;
}
int test01 = *(p[0]+1); 이러한 코드는 디버깅 모드에서 *(p[0]+1) 부분에 어떤 값이 들어가 있는지 쉽게 확인하기 위해 추가한 코드입니다.
저는 C compiler 로 다음 싸이트를 이용해서 살펴보았습니다.
https://www.onlinegdb.com/online_c_compiler#
디버깅 화면을 보겠습니다.
5.1 arr[2][3] 에 어떻게 {1,2,3,4,5,6} 을 할당하고 있을까
int arr[2][3] = {1,2,3,4,5,6}; 이라는 라인이 있습니다.
{1,2,3,4,5,6} 는 잘못된 표현이고 {{1,2,3},{4,5,6}} 이라고 할당해야 하는 것 아닐까요?
{1,2,3,4,5,6} 대신에 {{1,2,3},{4,5,6}} 으로 변경해도 결과는 동일했습니다. {1,2,3,4,5,6} 이라는 코드를 그대로 두고 디버깅을 해보면 arr 변수에 할당된 값이 {{1,2,3},{4,5,6}} 이라고 표시됩니다.
엄밀하게 표현하면 {{1,2,3},{4,5,6}} 이지만 {1,2,3,4,5,6} 으로 표현하는 것이 허용되는 것 같습니다. 암묵적인 형변환과 비슷한 것이라고 보입니다.
int arr[2][3] = {{1,2},{3,4},{5,6}};
이렇게 할당하면 어떤 결과일까요.
warning: excess elements in array initializer 라는 오류가 발생합니다.
5.2 int (*p)[3] 이 무슨 의미일까
int (*p)[3] 은 배열포인터입니다.
아래 링크에 설명이 잘되어 있습니다.
https://blockdmask.tistory.com/56
int 변수를 가리키는 포인터 샘플
#include <stdio.h>
int main() {
int* p = NULL; // 포인터
int i = 10;
p = &i;
printf("변수 i의 주소값 : %p \n", &i);
printf("포인터 p의 값 : %p \n", p);
printf("포인터 p이 가리키는 값 : %d \n", *p);
return 0;
}
변수 i의 주소값 : 0x7ffdb1c9b46c
포인터 p의 값 : 0x7ffdb1c9b46c
포인터 p이 가리키는 값 : 10
int[] 을 가리키는 포인터 샘플
#include <stdio.h>
int main() {
int* p = NULL;
int arr[] = {1,2,3};
p = arr;
int p0 = *p;
int p1 = *(p+1);
printf("포인터 p이 가리키는 값 : %d \n", *p);
printf("포인터 p+1이 가리키는 값 : %d \n", *(p+1));
return 0;
}
포인터 p이 가리키는 값 : 1
포인터 p+1이 가리키는 값 : 2
주소 | 값 | 참고 | |
int i = NULL; | &i | i | int* p |
int arr[] = NULL; | arr | arr[0] | int* p |
int arr[2][3] | arr | int (*p)[3] 배열포인터 |
'정보처리기사' 카테고리의 다른 글
[정처기] 필기 합격 후기 (0) | 2023.02.14 |
---|---|
[정처기] 필기 시험 보러갑니다. (0) | 2023.02.13 |
[정처기] 필기 기출(2020년09월26일) 스터디 (0) | 2023.02.11 |
[정처기] 필기 기출(2021년03월07일) 스터디 (0) | 2023.02.10 |
[정처기] 필기 기출(2021년 2회) 스터디 #2 (0) | 2023.02.09 |