포인터와 배열
배열을 포인터 변수에 저장한 후 포인터를 이용해 배열의 요소에 접근할 수 있다.
배열의 위치를 나타내는 첨자 즉 인덱스를 생략하고 배열의 대표명만 지정하면 배열의 첫 번째 요소의 주소를 지정하는 것과 같다.
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
'정보처리 기사 실기 > 기출 키워드노트' 카테고리의 다른 글
[키워드 노트] 정보처리기사 개정 후 예상개념 (0) | 2022.05.05 |
---|---|
[키워드 노트] 정보처리기사 실기 개정후 2개년 기출 주관식 (0) | 2022.05.03 |