강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

dbndus0024님의 프로필 이미지
dbndus0024

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

다차원 배열과 문자열 배열

21:50 이중배열과 포인터 관련 질문입니다

해결된 질문

작성

·

47

·

수정됨

0

char *a[2]= {"Hello","World"};

printf("%s\n",*a);=> 출력값: Hello

char*b[2][2]={{"hello","world"},{"app","dev"}};

printf("%s\n", *b); => 오류

일차원 일때는 출력할 때 정확한 값의 위치를 지정하지 않고 *a를 해도 출력이 되는데 이차원일 때는 안되는 이유가 무엇인가요?

답변 2

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요. 좋은 질문 감사드립니다.

 

우선, 지금 포인터 자체가 배열인 것은 알고 접근해야합니다.

값이 아니라 포인터를 2개로 선언하고 각 포인터가 문자의 시작 주소를 가리키고 있는 것입니다.

 


 

2차원 배열의 경우에는 아래와 같이 써야합니다.

 

#include <stdio.h>

int main(void)
{
    /* 1차원: char* 의 배열 ------------------------------------ */
    char *a[2] = {"Hello", "World"};
    printf("%s\n", *a);           // → "Hello"

    /* 2차원: char* 의 2×2 배열 -------------------------------- */
    char *b[2][2] = {{"hello", "world"},
                     {"app",   "dev"}};

    /* 올바른 접근 방법 */
    printf("%s\n", b[0][0]);      // → "hello"
    printf("%s\n", **b);          // 같은 결과

    return 0;
}

 

C언어 입장에서 2차원 배열을 생각해보면,

b라는 포인터는 실제로는 char *[2][2]를 가리키고 있습니다. 거기서 앞에 *을 다시 붙여서

*b로 만들면 char *[2]이 됩니다. 하나의 배열이 된다는 뜻이죠.

여기에서 다시 한 번 더 역참조해야합니다.

**b가 되어야지 최종적으로 문자열을 가리키는 char *이 됩니다.

 


요약하자면, 최종적으로 우리가 %s로 출력을 하기 위해서는 문자열의 주소를 줘야합니다.

a의 예제에서는 포인터가 2개짜리 배열이었기 떄문에 첫 포인터 주소가 1번에 역참조로 갈 수 있지만,

b에서는 정확히 문자열의 주소를 줘야 합니다.

 

한 번 참조했을 때는 문자열 시작 주소로 도달하지 못합니다.

*b는 포인터 테이블의 주소이지, hello가 시작되는 문자열의 주소가 아니라서 %s로 출력하지 못합니다.

 

그래서 한 번 더 역참조해서, 이번에는 진짜로 문자열이 시작되는 메모리 주소를 가져다 줘야지만 정상적으로 출력됩니다.

 


주소가 어떻게 다른지 대략적으로 예제를 가져왔습니다.

아래 예제는 LLM에 질의해서 받은 테이블이기 때문에 주소 영역은 무시하고 보셔도 됩니다.

스크린샷 2025-07-05 오후 1.07.18.png.webp

 

어쨌든 우리가 기억해야할 것은

%s는 무조건 문자열의 시작 주소를 밥으로 먹는 키워드입니다.

정확한 밥을 줘야지 소화할 수 있다고 생각하시면 좋습니다.

0

안녕하세요, 인프런 AI 인턴입니다. dbndus0024님.

C 언어에서 일차원 배열과 이차원 배열의 포인터 사용 시 *의 유무는 몇 가지 차이점이 있습니다. 이를 이해하는 키포인트는 배열과 포인터의 상호관계입니다.

1. 일차원 배열:

char *a[2] = {"Hello", "World"};
  • 이 경우, a는 문자열을 가리키는 포인터 배열입니다. *aa[0], 즉 “Hello”를 가리키게 됩니다. printf("%s\n", *a);를 사용하여 “Hello”라는 문자열 전체를 출력합니다.

2. 이차원 배열:

char *b[2][2] = {{"hello", "world"}, {"app", "dev"}};
  • b는 2x2 형태의 포인터 배열이며, 각각의 요소는 문자열을 가리킵니다. b[0][0]는 “hello” 문자열을 가리키는데, 이때 *가 필요하지 않습니다. printf("%s\n", b[0][0]);는 첫 번째 요소에서 직접 문자열을 출력합니다.

%s에서 *을 생략하는 이유:

  • %s 포맷은 포인터가 가리키는 주소부터 시작하여 널 종료문자(‘\0’)가 나올 때까지 문자열을 출력합니다. 이 때문에, 포인터 자체를 제공하면 C 언어 내부에서 적절히 문자열의 처음 주소부터 시작하여 처리가 이루어집니다.

관련 내용을 보다 더 정확히 이해하고 싶다면, 다음의 유사한 질문 및 답변을 참고하실 수 있습니다:
- 다차원 배열과 문자열 배열 22분 쯤

링크된 게시글에서 문자열과 배열 포인터의 사용에 대한 추가적인 설명과 예제를 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dbndus0024님의 프로필 이미지
dbndus0024

작성한 질문수

질문하기