프로그래밍임베디드 개발자

C 언어에서 포인터 배열이란 무엇이며 배열의 포인터와의 차이는 무엇인가요? 각각의 유형을 어떻게 올바르게 선언하고 사용할 수 있나요?

Hintsage AI 어시스턴트로 면접 통과

답변

포인터 배열 — 각 요소가 일반적으로 같은 유형을 가리키는 포인터로 구성된 구조입니다. 예를 들어, 문자열 목록을 저장하는 데 사용됩니다 (char *arr[];).

배열의 포인터 — 전체 배열의 시작 주소를 저장하는 변수입니다 (예: int (*ptr)[10];는 10개의 int 요소로 구성된 배열을 가리킵니다).

예제:

// char에 대한 포인터 배열 (문자열 배열) char *days[] = {"Sun", "Mon", "Tue"}; // 10개의 정수로 구성된 배열의 포인터 int arr[10]; int (*p)[10] = &arr; // 접근: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]

함정 질문

"char *arr[3];char (*arr)[3];의 차이는 무엇이며 각 경우에 문자열에 어떻게 올바르게 접근하나요?"

많은 사람들은 차이가 없다고 생각하거나 이것이 단순한 동의어라고 생각합니다.

올바른 답변:

  • char *arr[3]; — char에 대한 3개의 포인터로 구성된 배열 (일반적으로 문자열 배열).
  • char (*arr)[3]; — 3개의 char로 구성된 배열에 대한 포인터 (길이 3의 단일 문자열에 대한 포인터).
char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z

이 주제에 대한 미숙지로 인한 실제 오류 사례


이야기 1

메뉴를 위한 문자열 배열을 프로젝트에서 만들었지만 char menu[5][30];라고 작성했습니다. 이걸 함수에 char *menu로 잘못 전달하여 함수가 첫 번째 문자열만 작업하고 나머지는 손상되거나 프로그램이 충돌했습니다.


이야기 2

배열의 포인터 배열을 만들려고 시도했습니다: int *arr[10];를 반복문을 통해 초기화했지만, 실제로는 로컬 배열에 대한 포인터를 저장하여 접근할 때 UB가 발생했습니다.


이야기 3

버퍼를 위한 FIFO 큐 구현에서 전체 큐의 주소를 얻는 것 (배열의 포인터)과 요소를 얻는 것 (블록에 대한 포인터 배열)을 혼동했습니다. 이로 인해 포인터 이동이 부정확해져 데이터가 손실되었습니다.