정보처리 기사 실기/기출 키워드노트

C언어 포인터와 배열 그리고 이차원 배열

유혁스쿨 2022. 4. 4. 17:06
728x90
반응형

포인터와 배열

배열을 포인터 변수에 저장한 후 포인터를 이용해 배열의 요소에 접근할 수 있다.

배열의 위치를 나타내는 첨자 즉 인덱스를 생략하고 배열의 대표명만 지정하면 배열의 첫 번째 요소의 주소를 지정하는 것과 같다.

int a[5], *b;

b = a; // 배열의 대표명을 적었으므로 a배열의 시작 주소인 a[0]의 주소를 b에 저장한다.
b = &a[0]; // a배열의 첫 번째 요소인 a[0]의 주소(&)를 b에 저장한다.

다음은 배열 a를 공간으로 표현한다.

 

 

 

배열 a 첫 번째 두 번째 세 번째 네 번째 다섯 번째
배열 표기 a[0] a[1] a[2] a[3] a[3]
포인터 표기 *(a+0) *(a+1) *(a+2) *(a+3) *(a+4)

이차원 배열에 대해서는 실제 기출문제에 출제된 문제를 풀며 함께 이해해본다.

 

2022년 1회 정보처리기사 필기

제 4과목 프로그래밍 언어 활용 62번 문제 풀이

포인터와 배열사이의 관계

#include <stdio.h>
#include <stlib.h>
int main (int argc, char *argv[0]){
    int arr[2][3] = {1,2,3,4,5,6};
    int (*p)[3] = NULL;
    p = arr;
    printf("%d,", *(p[0]+1) + *(p[1]+2));
    printf("%d,", *(*(p+1)+0) + *(*(p+1)+1));
    return 0;
}

이차원 배열은 다음과 같이 나타낸다.

arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][1] = 4 arr[1][2] = 5 arr[1][3] = 6

 

arr배열은 2차원 배열로 1,2,3 요소로 하나의 배열을 구성하고, 4,5,6 요소로 다른 하나의 배열을 구성하게된다.

1 2 3

arr[0]과 같이 작성한다면 이차원 배열중 1행의 요소들을 참조하게 되고

arr[0] = {arr[0][1], arr[0][1], arr[0][2]}

4 5 6

arr[1]과 같이 작성한다면 이차원 배열중 2행의 요소들을 참조하게 된다.

arr[1] = {arr[1][1], arr[1][1], arr[1][2]}

 

그 후 포인터를 정의하게 되는데,

int (*p)[3] : 3개의 int값을 가지는 하나의 배열을 가리키는 포인터를 null로 초기화하는데 즉, 아래와 같다.

null null null

 

해당 포인터 배열 변수 p에 배열 arr을 할당하게 된다.

이때, 배열명 arr만 작성되면 arr[0]과 같기 때문에 배열 p 는 arr[0] 즉, {1,2,3}을 가리킨다.

 

 

p[0] = *(p+0) 즉, p에 인덱스 0을 더해서 참조하라는 뜻이다.

 

*(p[0] + 1) = *(*(p + 0) + 1)

p는 3개의 엘리먼트를 갖는 배열을 참조하는 포인터이다.

따라서 p에 1을 더한다거나 2를 더하면 처음으로부터 3칸(1행 이동)을 움직이거나, 처음으로부터 6칸(2행 이동)을 움직이게된다. (0이면 제자리를 나타낸다.)

 

이것을 문제에 적용하면 *(p+0)은 {1,2,3} 배열을 의미한다. (0이면 제자리 이기 때문)

*( ___ + 1) 에서 정수 1은 int * (Interger Pointer)를 의미하는데 첨자로부터 1칸을 이동하는것을 뜻한다. (기준은 0번째 인덱스)

따라서 *(p+0) 은 {1,2,3} 배열을 의미하고 그 배열요소중 1칸을 이동하게되면 2가 된다.

 

*(p[1] + 2) = *(*(p+1)+2)

*(p + 1) : 배열 2번째 행 {4,5,6}을 의미한다.

*( ___ + 2) : 해당 배열 요소들 중(4를 기준으로) 2칸을 이동하게 되면 6이 된다.

 

결과적으로 2 + 6은 8이 된다.

 

*(*(p + 1) + 0) 은 {4,5,6}의 4

*(*(p + 1) + 1) 은 {4,5,6}의 5 

따라서 4+5는 9가 된다.

 

풀이는 아래 유투브를 보며 이해했다.

 

 

https://www.youtube.com/watch?v=AQFNQjfsLmc

 

728x90
반응형