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

김인도님의 프로필 이미지

작성한 질문수

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

C언어 기출문제의 변형

포인터 ++

24.07.17 00:23 작성

·

193

1

  • 1000022778.jpg++가 앞에나오면 +1
  • ++가 뒤에나오면 *(a+1)이 되는 이유가 뭘까요..
ptr=atr인데5번에 *ptr이 기존에 누적값을 갖고있는데*atr이 다시 처음값부터 시작된다는점이 이해가 안가요.32가 나와야하는게 맞지않나요?

답변 2

1

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

2024. 07. 17. 23:28

안녕하세요,

제가 설명을 좀 띄엄띄엄했나 싶습니다.

연산자에 대해서 따로 특별 영상을 만들어야겠습니다..

 


해설을 좀 해드리자면,

우선 ++하고 그냥 +1을 출력하는 것은 아예 다른 이야기입니다.

++는 말 그대로 하나를 증가시킨 이후에 나에게 반영하는 것입니다.

예를 하나 들어보겠습니다.

int a = 1;
printf("%d || ", ++a);
printf("%d", a);

이것의 출력값은 2 || 2 가 출력됩니다.

a가 1+1이 되면서 증가하자마자 출력되고, 그 다음에 a 그 자체를 출력했는데도 여전히 2입니다.

 

int a = 1;
printf("%d || ", a+1);
printf("%d", a);

이 경우는 어떨까요?

출력값은 2 || 1 이 됩니다.

왜냐하면 출력 자체에 그냥 1을 더해서 출력한거지, a는 바뀐 것이 없기 때문입니다.

 

후위 연산자(++, --가 변수의 뒤에 있는 경우)는 관련 연산을 먼저하고 줄이 넘어갈 때 증가나 감소를 합니다.

예제를 보면

int a = 1;
printf("%d || ", a++);
printf("%d", a);

이 경우에는 출력값이 1 || 2 입니다. ++가 후위 연산자이기 때문에 관련 연산(출력이나 덧셈 등)을 다 하고 줄이 넘어갈 때 증가합니다. 이것은 그 자체가 증가하기 때문에 a는 하나가 증가된 값이 들어갑니다.



다시 문제로 돌아옵시다.

ptr와 arr은 완전히 다른 애입니다. 하나는 손가락이고 하나는 메모리가 주~~욱 연결되어서 오밀조밀하게 붙어있는 숫자 덩어리입니다.

ptr은 손가락이고, 플러스 하나가 증가되면 그냥 다음 것을 가리킵니다. arr은 그냥 존재하는 배열 자체입니다.

arr은 그래서 누적되거나 바뀐 것이 없는 것이고, ptr은 손가락이 왔다갔다하면서 계속 누적되며 여기저기를 가리킵니다.

그래서 값이 달라지는 것입니다.

 

이해에 도움이 좀 되셨을까요?

손혁진님의 프로필 이미지

2024. 07. 23. 22:56

좋은 설명 감사합니다.

euncherry_k님의 프로필 이미지

2024. 07. 26. 23:17

안녕하세요.
1번과 3번이 너무 헷갈려서 답글을 답니다.

1번과 3번이 21이 나오는 것은 이해가 되었습니다.

하지만, 1번은 arr[0]인데 3번은 arr[1]이 되는 것이 이해가 안됩니다.

++*ptr은 값만 1 증가하는거고,

*ptr++는 값 인덱스를 증가하는건가요?

만약 맞다면, 모든 경우에서 전위 증가 연산자는 값 증가

후위는 인덱스 증가 인가요?

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

2024. 07. 26. 23:38

안녕하세요.

섹션 "드물게 출제되는 문법"의 연산자 우선순위 부분을 꼭 재수강 부탁드립니다.

 

++*ptr은 메모리 연산자가 먼저 적용됩니다. 그래서 값을 가져오고, 그 값을 증가시킵니다.

*ptr++의 경우에는 후위연산자가 먼저입니다.

그래서 포인터를 증가시킬 (예정)것인데, 다음 줄로 가서 하나가 증가하겠죠.

후위연산자니까요.

 

그래서 일단은 현재 가리키고 있는 것의 값을 가져옵니다.

(그리고 다음 줄에 갔을 때 ptr은 다음 것을 가리키고 있음)

euncherry_k님의 프로필 이미지

2024. 07. 27. 00:13

image.png

강의 재수강 했습니다...ㅎㅎㅎ.. 짚어주셔서 감사합니다.

우선 순위는 후위 > 전위 > 포인터 이고,

1번은 *ptr에 대해 전위 증가가 먼저 이기 때문에 값 증가이고,

3번은 ptr++가 먼저 -> 그다음 *(포인터) 이기 때문에 주소가 증가하는걸로 이해했습니다.

제가 제대로 이해한걸까요?

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

2024. 07. 27. 11:07

네 필기 너무 예쁘게 잘하셨네요.
1. ++*ptr : ptr이 가리키는 값. 배열이 바로 할당되었을 경우에는 첫 번째 요소 증가

  1. *ptr++ : 포인터 ptr은 증가(하는데 너 나중에 커지고 일단 지금은 그대로야). 현재 포인터가 가리키고 있는 값을 가져와라
    3. *++ptr : ptr을 전위로 증가시키고 그 다음에 그 값을 가져와라. 배열을 바로 할당받은 상태라고 가정한다면 2번째 요소(1번 인덱스)의 값을 가져옵니다.

 

시간 여유가 되실 때 수강평 하나 부탁드립니다.. 😃

1

류경호님의 프로필 이미지

2024. 07. 17. 01:59

++*ptr

++*ptr전위 증가 연산자로, 다음과 같이 작동합니다:

  1. ptr이 가리키는 값을 먼저 증가시킵니다.

  2. 증가된 값을 사용합니다.

예를 들어, 만약 ptrarr[0]을 가리키고 있고, arr[0]의 값이 20이라면:

  • ++*ptr*ptr(즉, arr[0])의 값을 21로 증가시킵니다.

  • 그 다음, 증가된 값을 반환하여 출력합니다.

*ptr++

*ptr++후위 증가 연산자로, 다음과 같이 작동합니다:

  1. ptr이 가리키는 현재 값을 사용합니다.

  2. ptr을 다음 요소로 이동시킵니다.

예를 들어, 만약 ptrarr[0]을 가리키고 있고, arr[0]의 값이 20이라면:

  • *ptr++*ptr(즉, arr[0])의 현재 값을 사용하여 출력합니다.

  • 그 다음, ptrarr[1]로 이동시킵니다.

2번은 *(arr+1) 이고 5번은 (*arr+1) 입니다.

2번은 배열요소를 한칸 옮겨서 30 값이 나옵니다.

5번은 *arr값 21에 +1을 해줘서 22값이 나옵니다.

저도 같은 부분에서 막혀서 공유합니다~