inflearn logo
강의

Khóa học

Chia sẻ kiến thức

(Mới nhất 2026!) Vượt qua kỳ thi thực hành Kỹ sư xử lý thông tin chỉ trong một tuần

Biến thể của các câu hỏi thi cũ ngôn ngữ C

C언어 기출문제 변형에서 6번 문제입니다. 20:56

Đã giải quyết

11

kimyc4568528871

3 câu hỏi đã được viết

0

20:56번의 문제가 잘 이해가 되지 않습니다.
특히나 다른 사람 질문 내용 봤는데도요

int arr[5] = {20,30,40,50,60}

int *ptr;

ptr= arr;

++*ptr이 왜 21인인가요?
실행 순서때문에 그런건가요?
제가 생각한건
사실 먼저 증가된다음 포인터가 호출될꺼라 생각을 해서 *(ptr+1) == *(arr +1) == arr[1] 을 생각하긴했거든요
*ptr++의 경우
*ptr은 주소 값이 아닌 주소값의 value를 가져오는거라
value값을 가지오는 과정 후에 ++연산이 들어간다고 생각을 해서
*ptr++==arr[0]++ == arr[0]+1로 생각을 했거든요

이부분에 대해 설명이 필요해서 돌려보는데 이해가 잘 안되서요
++*ptr이 arr[0]+1인거랑

*ptr++가 arr[0+1]인 설명이 필요합니다.
일단 외울께요

python java c 정보처리기사 정보처리산업기사

Câu trả lời 3

0

kimyc4568528871

감사합니다 이해가 잘 되었습니다.

 

0

weekendcode

안녕하세요!

핵심은 *++의 우선순위 및 결합 방향입니다.


++*ptr++(*ptr)로 해석됩니다.*가 먼저 ptr에 붙어서 "ptr이 가리키는 값(arr[0])" 자체를 가리키게 되고, 전위 ++가 그 값을 1 증가시킵니다. 즉 포인터는 그대로 arr[0]을 가리키고 있고, 배열 원소의 값만 20에서 21로 바뀌는 것입니다. 그래서 결과는 21이고, arr[1]과는 전혀 관계가 없습니다.


*ptr++*(ptr++)로 해석됩니다. 후위 ++*보다 우선순위가 높기 때문에 ++*ptr이 아니라 ptr 자체에 먼저 붙습니다. ptr++는 포인터를 다음 칸으로 이동시키되, 후위 연산이므로 식의 결과값으로는 이동 전의 원래 주소가 가리키던 값을 돌려줍니다.

그 다음 *가 그 값을 읽습니다. 즉 값은 그대로 두고 포인터의 위치만 다음 원소로 옮기는 것입니다.


질문자께서 생각하신 arr[0]++는 사실 (*ptr)++라고 괄호를 쳤을 때의 이야기입니다.

*ptr++에서는 ++ptr에 붙는 것이지 *ptr(배열 값)에 붙는 게 아니라서 의미가 다릅니다.

정리하면 이렇게 기억하시면 됩니다.


  • ++*보다 왼쪽에 있으면(++*ptr) → 을 증가시킵니다. 포인터는 안 움직입니다.

  • ++ptr 바로 오른쪽에 있으면(*ptr++) → 포인터를 증가시킵니다. 값은 그대로이고 위치만 이동합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 달아단거님.

C 언어에서 포인터와 배열의 증감 연산자는 처음 접할 땐 헷갈릴 수 있는 부분이 많습니다. 질문하신 ++*ptr*ptr++의 작동 원리를 설명드리겠습니다.

  1. ++*ptr:

    • 이 경우, 연산자 우선순위에 의해 ptr이 현재 가리키고 있는 주소의 이 먼저 증가됩니다.
    • 따라서, arr의 첫 번째 요소인 arr[0]에 접근하여 그 값을 20에서 21로 증가시키게 됩니다.
    • 이는 포인터가 먼저 가리키는 값(즉 arr[0])을 가져와서 1을 더하고, 그 값이 증가된 상태로 저장되는 것입니다.
  2. *ptr++:

    • 여기에선 포인터가 가리키고 있는 현재 위치의 값을 먼저 참조한 후, 포인터 ptr 자체가 1 증가합니다. 이 때문에, 이 후의 연산에선 ptr이 다음 배열 요소 arr[1]을 가리키게 됩니다.
    • 즉, *ptr++은 포인터가 현재 배열 인덱스에서 값을 사용한 후에 포인터 위치를 1 증가시킵니다.
    • 결과적으로 arr[0]의 값을 가져오고, ptr은 다음 위치로 이동하지만 해당 위치의 값은 변경되지 않습니다.

이 차이는 바로 전위 연산자와 후위 연산자의 차이에서 기인합니다. 전위 연산자는 값을 먼저 증가시키고 연산을 시작하는 반면, 후위 연산자는 값을 먼저 사용하고 그 후에 증가시키는 순서로 진행합니다.

좀 더 심화된 설명과 유사한 사례를 통해 추가적인 이해가 필요하시다면, 아래 링크들을 참조하시기 바랍니다:

이 링크들은 포인터와 배열의 상호작용에 대한 다양한 예시와 자세한 설명을 포함하고 있어 큰 도움이 될 것입니다.

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

75강 26년 1회 코드 문제 해석 강의 질문 드립니다.

0

3

1

모의고사

0

12

1

17강 28:26

0

12

1

17강 22:38

0

20

2

16강 2:17

0

20

2

부모 및 자식 생성자 출력 관련

0

11

1

부모 및 자식 생성자 출력

0

16

2

9강 35분경 질문있습니다

0

25

2

11강 3:20

0

27

2

10강 11:42

0

27

2

9강 26:23

0

44

2

9강 23:46

0

32

2

코드 중간에 . 붙은건 뭐라고 봐야할까요?

0

45

2

설명중 단어 의미 해석 문제.

0

29

1

수강 섹션마다 옆에 자료 다운로드 버튼이 있는데. 다운받으면 무슨내용이 있는건가요?

0

21

1

SQL 집중학습

0

41

1

NULL과 0

0

47

2

26년 1회 기출문제 11번 질문드립니다

0

46

1

업캐스팅 문제예시5 & 업캐스팅 문제 예시 6

0

45

2

V1.2 VS V.091

0

49

2

split('T')일때는 T만 제거되는거고 공백은 제거되지 않는 건가요?

0

50

2

파이썬 언어 업데이트, 언어별 학습자료 업데이트

0

49

2

C, java, python 언어 기출문제 강의 질문

0

52

2

1:26 에서 반복문 i[1] 이니까 0 다음 두번째 항목들 아닌가요

0

52

2