다차원 배열 포인터 질문있습니다
3
1 asked
20:28에서
const char *arr[2][2]={{Hello", "World"}, {"app", "dev"}};
이때 선언된 *arr포인터는 주소를 먹는 애로 알고 있는데, 그럼 우항의 {{Hello", "World"}, {"app", "dev"}} 이부분이 주소를 나타낸다는 뜻일까요? 추측하건대 배열이 변수 그자체로 주소를 나타내는것처럼 그것과 동일한 의미로 받아들이면 될까요?
제가 어거지로 이해해본것을 말하자면 ‘{{Hello", "World"}, {"app", "dev"}};’이 배열은 어딘가 이미선언된 k[2][2] 배열이고 k라고 우항에 쓴것과 마찬가지다..로 이해하면 되는걸까요..? 아직 공부가 부족한가 봅니다 ㅠ계속 이해가 안되면 그냥 문자열 배열이 들어오면 c언어의 한계때문에 선언할때 포인터를 사용한다. 이정도로만 암기하고 넘어가도 되나 싶네요
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다. 전다영님.
질문하신 선언은 다음과 같은 의미입니다.
const char *arr[2][2] = {
{"Hello", "World"},
{"app", "dev"}
};
arr은 문자열을 가리키는 포인터 4개를 담은 2×2 배열입니다.
arr[0][0] → "Hello"
arr[0][1] → "World"
arr[1][0] → "app"
arr[1][1] → "dev"
여기서 우항의 초기화 목록 전체가 이미 선언된 k[2][2] 배열의 주소를 의미하는 것은 아닙니다. {{...}, {...}}는 배열을 초기화하기 위한 초기값 목록입니다.
각 문자열 리터럴은 메모리에 저장되고, 문자열 리터럴을 사용할 때 해당 문자열의 시작 주소를 가리키는 포인터 형태로 변환되어 배열에 저장됩니다.
예를 들어 다음과 같은 관계입니다.
const char *arr[2][2] = {
{"Hello", "World"},
{"app", "dev"}
};
개념적으로는 다음과 비슷하게 이해할 수 있습니다.
arr[0][0] = "Hello"; // "Hello"의 시작 주소
arr[0][1] = "World"; // "World"의 시작 주소
arr[1][0] = "app"; // "app"의 시작 주소
arr[1][1] = "dev"; // "dev"의 시작 주소
다만 arr[0][0]이 문자열 전체를 직접 저장하는 것이 아니라, 문자열의 첫 번째 문자를 가리키는 주소를 저장한다는 점이 중요합니다.
printf("%s\n", arr[0][0]); // Hello
printf("%c\n", arr[0][0][0]); // H
printf("%s\n", arr[0][0] + 1); // ello
또한 *arr에서 *는 arr 자체가 단순한 포인터 변수라는 뜻이 아닙니다. 선언에서는 배열 첨자 []의 우선순위가 *보다 높기 때문에 다음과 같이 해석됩니다.
const char *arr[2][2];
즉,
arr은 2×2 배열이고,
각 요소가 const char를 가리키는 포인터이다.
반면 아래 선언은 의미가 다릅니다.
const char **arr[2][2]; // const char*를 가리키는 포인터의 2×2 배열
질문하신 코드에서는 *arr이 하나의 포인터 변수를 선언하는 것이 아니라, arr[2][2]의 각 요소가 포인터라는 의미입니다.
문자열을 포인터 배열이 아닌 실제 문자 배열에 저장하는 방법도 있습니다.
char arr[2][2][6] = {
{"Hello", "World"},
{"app", "dev"}
};
이 경우에는 각 문자열을 저장할 실제 공간이 배열 안에 만들어집니다. "Hello"와 "World"는 널 문자 '\0'까지 포함해야 하므로 최소 6칸이 필요합니다. 포인터 배열은 문자열마다 길이가 달라도 사용할 수 있고, 문자 배열은 각 문자열에 확보할 최대 크기를 미리 정해야 한다는 차이가 있습니다.
관련 내용을 다룬 기존 답변을 함께 참고해 보세요.
문자열 배열
const char *arr[2][2]에서 각 배열 요소가 문자열의 시작 주소를 저장하는 방식과char arr[2][2]와의 차이를 설명합니다.다차원 배열 입력 구문
정수 배열과 문자열 포인터 배열에서*가 붙는 이유를 설명합니다.이중배열 관련
char *arr[2][2]와 문자 배열의 차이, 문자열의 널 문자에 대해 설명합니다.
문자열이 들어오면 무조건 포인터를 사용해야 하는 것은 아니지만, C언어에서는 문자열 리터럴을 여러 개 저장할 때 const char * 포인터 배열을 자주 사용합니다. 우선은 “배열의 각 칸에 문자열 자체가 아니라 문자열의 시작 주소가 저장된다”라고 이해하시면 충분합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
이론 파트 재탕
0
15
1
모의고사 5회
0
15
0
12분 10초 func(values, 0, 1)을 넣을 때
0
16
1
모의고사 1회 4번 문제와 관련한 질문이 있습니다.
0
17
2
재탕문제
0
33
1
재탕문제
0
22
0
파이썬 추가 코드
0
42
1
배열 포인터 출력 표시
0
51
2
포인터 증감 또는 값 증감
0
49
2
배열 포인터 함수 관련
0
44
2
실기 이론 통합 요약본 버전
0
54
2
업캐스팅 3번 문제 예시
0
57
2
push pop 설명 되어있는 강의가 몇강인가요?
0
48
1
모의고사 파일오류
1
82
3
모의고사 다운
0
57
1
업캐스팅 원칙
0
68
2
6분46초
0
59
2
공략법
0
68
1
모의고사 파일과 이론파일 업데이트
1
78
3
이론 pdf 다운은 어디서 하나요?
0
74
2
13분 40초
1
71
2
정보처리기사 26년 실기 2회 네트워크 부분
0
79
2
기출문제 재탕
0
59
1
뻬먹은 코드
0
47
1

