C언어 기출문제 변형에서 6번 문제입니다. 20:56
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]인 설명이 필요합니다.
일단 외울께요
답변 3
0
안녕하세요!
핵심은 *과 ++의 우선순위 및 결합 방향입니다.
++*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
안녕하세요, 인프런 AI 인턴입니다. 달아단거님.
C 언어에서 포인터와 배열의 증감 연산자는 처음 접할 땐 헷갈릴 수 있는 부분이 많습니다. 질문하신 ++*ptr과 *ptr++의 작동 원리를 설명드리겠습니다.
++*ptr:- 이 경우, 연산자 우선순위에 의해
ptr이 현재 가리키고 있는 주소의 값이 먼저 증가됩니다.
- 따라서,
arr의 첫 번째 요소인arr[0]에 접근하여 그 값을 20에서 21로 증가시키게 됩니다.
- 이는 포인터가 먼저 가리키는 값(즉
arr[0])을 가져와서 1을 더하고, 그 값이 증가된 상태로 저장되는 것입니다.
- 이 경우, 연산자 우선순위에 의해
*ptr++:- 여기에선 포인터가 가리키고 있는 현재 위치의 값을 먼저 참조한 후, 포인터
ptr자체가 1 증가합니다. 이 때문에, 이 후의 연산에선ptr이 다음 배열 요소arr[1]을 가리키게 됩니다.
- 즉,
*ptr++은 포인터가 현재 배열 인덱스에서 값을 사용한 후에 포인터 위치를 1 증가시킵니다.
- 결과적으로
arr[0]의 값을 가져오고,ptr은 다음 위치로 이동하지만 해당 위치의 값은 변경되지 않습니다.
- 여기에선 포인터가 가리키고 있는 현재 위치의 값을 먼저 참조한 후, 포인터
이 차이는 바로 전위 연산자와 후위 연산자의 차이에서 기인합니다. 전위 연산자는 값을 먼저 증가시키고 연산을 시작하는 반면, 후위 연산자는 값을 먼저 사용하고 그 후에 증가시키는 순서로 진행합니다.
좀 더 심화된 설명과 유사한 사례를 통해 추가적인 이해가 필요하시다면, 아래 링크들을 참조하시기 바랍니다:
이 링크들은 포인터와 배열의 상호작용에 대한 다양한 예시와 자세한 설명을 포함하고 있어 큰 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
17강 28:26
0
2
1
17강 22:38
0
13
2
16강 2:17
0
18
2
부모 및 자식 생성자 출력 관련
0
10
1
부모 및 자식 생성자 출력
0
14
2
9강 35분경 질문있습니다
0
22
2
11강 3:20
0
24
2
10강 11:42
0
22
2
9강 26:23
0
35
2
9강 23:46
0
31
2
코드 중간에 . 붙은건 뭐라고 봐야할까요?
0
38
2
설명중 단어 의미 해석 문제.
0
25
1
수강 섹션마다 옆에 자료 다운로드 버튼이 있는데. 다운받으면 무슨내용이 있는건가요?
0
20
1
SQL 집중학습
0
40
1
NULL과 0
0
43
2
26년 1회 기출문제 11번 질문드립니다
0
44
1
업캐스팅 문제예시5 & 업캐스팅 문제 예시 6
0
44
2
V1.2 VS V.091
0
48
2
split('T')일때는 T만 제거되는거고 공백은 제거되지 않는 건가요?
0
50
2
파이썬 언어 업데이트, 언어별 학습자료 업데이트
0
48
2
C, java, python 언어 기출문제 강의 질문
0
52
2
1:26 에서 반복문 i[1] 이니까 0 다음 두번째 항목들 아닌가요
0
49
2
d
0
45
2
출력값
0
43
2





