강의

멘토링

로드맵

Inflearn brand logo image

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

김영서님의 프로필 이미지
김영서

작성한 질문수

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

정렬 스페셜 - 합병정렬

C언어에서 포인터, 배열, 문자연산

해결된 질문

작성

·

40

·

수정됨

0

안녕하세요 선생님

항상 강의 잘 듣고 있습니다.

 

문제를 푸는 중에 궁금했던 건데요.
이런 코드에서 어떨 때는 배열 내 위치를 하나 더 움직이고 어떨 때는 ASCII 코드의 그 다음 알파벳을 뱉는데 이게 너무 헷갈립니다..ㅠ

주소에서 연산을 하는 거면 배열에서 위치를 옮기고
값에서 연산을 하는거면 ASCII코드에서 다음 알파벳을 뱉으면 되는건가요..?

주석에 제가 이해하는 법을 적어놨는데 이렇게 이해하면 되는걸까요?

특히,
printf("%s", a+2); 이런 부분 같은 경우에는
a+2에서 a는 시작주소를 뜻하니 a[0], 따라서 a[0]+2 --> a[0]은 값이니 h, h라는 값에서+2하니까 j
이런 사고 과정으로도 흘러가는 거 같아 헷갈립니다..ㅠㅠ

답변 주시면 감사하겠습니다!

# include <stdio.h>
int main() {   
    char a[6] = "hello";
    printf("%s", a+2); // a는 시작주소(=a[0])를 뜻하니 a[0]의 주소에서 2번 옮김? -> llo
    printf("%c", a[1]+2); //a[1]은 값으로 e를 뱉으니 ASCII? -> g
    printf("%c", *a+1); // *a는 a[0]의 값 h를 뱉으니 ASCII? -> i
    printf("%c", *(a+1)); //(a+1)은 a[0]에서 하나를 더 움직인 주소 ->의 값 = e
    printf("%c", a[1]); // a[1] = e
    return 0;
}

출력값 : llogiee

답변 2

0

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

안녕하세요, 볼드체로 질문 주신 것 자체는 맞습니다.

 

포인터가 움직이면 배열에서 앞이나 뒤의 메모리 주소로 가는 것이고,

값 자체가 플러스 마이너스인 경우에는 코드값이 바뀌겠죠.

 

아스키코드라는 것은 그냥 허상입니다.

원래 컴퓨터는 다 이진수를 사용하죠.

그 이진수를 문자로 출력하면 문자인거고 숫자이면 숫자로 나오는 것 뿐입니다. (%c, %d)

그것에 맵핑되어 있는 코드를 아스키코드라고 부르는 것 뿐입니다.

 

주신 코드 자체는 모두 맞습니다.

생각하신 방향 주석도 맞고요.

 

조금만 더 공부할 수 있다면,

지금은 단순히 실제 주소에 +1만 하셨는데

아예 증감연산자(++, --)가 붙은 코드를 학습하시는 것이 좋습니다.

 

그리고 실제 시험은 증감연산자로 나옵니다.

 

증감연산자는 아예 그 자체에 반영해버리기 때문에 이전 것을 기억하면서 출력해야 합니다.

생각하신 방향과 개념은 모두 맞습니다.

 

0

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

C 언어에서 포인터, 배열, 및 ASCII 코드와 관련된 연산은 처음에는 헷갈리기 쉬울 수 있습니다. 궁금하신 부분에 대한 설명을 드리고, 코드에 대한 이해를 도와드리겠습니다.

  1. printf("%s", a+2);

    • 여기서 a는 배열의 시작 주소를 나타냅니다. 따라서 a+2는 배열의 시작 주소에서 두 칸 뒤를 가리키게 됩니다. 이는 문자열 상에서 세 번째 글자 ‘l’을 시작으로 llo가 출력됩니다.
  2. printf("%c", a[1]+2);

    • a[1]은 배열의 두 번째 요소로, 문자 ‘e’를 가리킵니다. a[1]+2는 ASCII 코드 ‘e’(101)에 2를 더하여 103, 즉 문자 ‘g’가 됩니다.
  3. printf("%c", *a+1);

    • *a는 포인터 연산자로 a[0]의 값, 즉 ‘h’를 의미합니다. ASCII 코드로 1을 추가하면 105로, 이는 문자 ‘i’를 나타냅니다.
  4. printf("%c", *(a+1));

    • (a+1)은 배열의 두 번째 요소를 가리키는 주소를 의미하며, 거기에는 ‘e’가 저장되어 있습니다.
  5. printf("%c", a[1]);

    • a[1] 자체는 배열의 두 번째 요소인 문자 ‘e’입니다.

요약하면, 주소에 연산을 수행할 때는 배열 내에서 위치를 이동하며, 에 연산을 수행할 때는 ASCII 코드 연산이 이루어집니다. 그리고 지금 혼동되시는 부분은, a+ 연산이 배열의 포인터이기 때문에 주소를 이동시키는 행위이고, *a 또는 a[n]처럼 값을 가져오는 연산은 ASCII 값을 기반으로 합니다.

인프런 강의에서 탐색 가능한 관련된 답변을 찾았으니, 도움이 되실 것입니다:

이 질문들에서는 포인터와 배열, ASCII 연산에 대해 다양한 사례와 설명이 제공됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김영서님의 프로필 이미지
김영서

작성한 질문수

질문하기