정보처리기사

[정처기] 기출문제 C (배열포인터)

멋쟁이천재사자 2023. 2. 12. 10:57

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] 배열포인터