포인터 배열 — 각 요소가 일반적으로 같은 유형을 가리키는 포인터로 구성된 구조입니다. 예를 들어, 문자열 목록을 저장하는 데 사용됩니다 (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 큐 구현에서 전체 큐의 주소를 얻는 것 (배열의 포인터)과 요소를 얻는 것 (블록에 대한 포인터 배열)을 혼동했습니다. 이로 인해 포인터 이동이 부정확해져 데이터가 손실되었습니다.