programing

C에서 *ptr += 1과 *ptr++ 사이의 차이

goodsources 2022. 11. 10. 20:55
반응형

C에서 *ptr += 1과 *ptr++ 사이의 차이

이제 막 C를 공부하기 시작했는데, 함수의 파라미터로서 포인터에 포인터를 건네는 예를 하나 들 때 문제가 발견되었습니다.

샘플 코드는 다음과 같습니다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int* allocateIntArray(int* ptr, int size){
    if (ptr != NULL){
        for (int i = 0; i < size; i++){
            ptr[i] = i;
        }
    }
    return ptr;
}

void increasePointer(int** ptr){
    if (ptr != NULL){
        *ptr += 1; /* <----------------------------- This is line 16 */
    }
}

int main()
{
    int* p1 = (int*)malloc(sizeof(int)* 10);
    allocateIntArray(p1, 10);

    for (int i = 0; i < 10; i++){
        printf("%d\n", p1[i]);
    }

    increasePointer(&p1);
    printf("%d\n", *p1);
    p1--;
    free(p1);
    fgets(string, sizeof(string), stdin);
    return 0;
}

16번째 줄에서 문제가 발생하며 수정 시*ptr+=1로.*ptr++예상되는 결과는 어레이 전체와 넘버1이어야 하는데*ptr++결과는 0 입니다.

에 차이가 있습니까?+=1그리고.++둘 다 같은 줄 알았어요.

이 차이는 연산자의 우선순위에 기인합니다.

증가 후 연산자++참조 해제 연산자보다 우선 순위가 높습니다.*.그렇게*ptr++와 동등하다*(ptr++)즉, 포스트 인크리먼트는 포인터가 가리키는 것이 아니라 포인터를 변경합니다.

할당 연산자+=참조 해제 연산자보다 우선 순위가 낮다.*,그렇게*ptr+=1와 동등하다(*ptr)+=1즉, 할당 연산자는 포인터가 가리키는 값을 수정하고 포인터 자체는 변경하지 않습니다.

질문에 관련된 3개의 연산자의 우선순위는 다음과 같습니다.

사후 처리++> 참조 해제*> 할당+=

주제에 대한 자세한 내용은 이 페이지를 참조하십시오.

식을 구문 분석할 때, 일부 행에 나열된 연산자는 해당 행 아래에 나열된 연산자보다 인수에 더 엄격하게 바인딩됩니다(괄호처럼).예를 들어 다음과 같은 식입니다.*p++라고 해석됩니다.*(p++), 로서가 아닌(*p)++.

간단히 말해서 이 과제를 표현하기 위해서*ptr+=1post-disclosed 연산자를 사용하여 역참조 연산자에 괄호를 추가하여 작업 우선순위를 부여해야 합니다.++이와 같이

괄호를 붙여 작업 순서를 표시해 봅시다.

a + b / c
a + (b/c)

다시 한번 하자

*ptr   += 1
(*ptr) += 1

그리고 다시 한 번 말씀드리면

*ptr++
*(ptr++)
  • *ptr += 1포인터가 가리키는 변수의 값을 늘립니다.
  • *ptr++전체 문장(코드 행)이 완료된 후 포인터를 증가시키고 포인터가 가리키는 변수에 대한 참조를 반환합니다.

후자를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

for(int i = 0; i < length; i++)
{
    // Copy value from *src and store it in *dest
    *dest++ = *src++;

    // Keep in mind that the above is equivalent to
    *(dest++) = *(src++);
}

이것은 일반적인 복사 방법입니다.src다른 것으로 배열하다.dest어레이를 설정합니다.

아주 좋은 질문입니다.

K&R "C 프로그래밍 언어" "5.1 포인터와 주소"에서 이에 대한 답을 얻을 수 있습니다.

"단항 연산자 * 및 & &는 산술 연산자보다 더 단단하게 결합됩니다."

*ptr += 1      //Increment what ptr points to.

"* 및 ++와 같은 단항 연산자는 오른쪽에서 왼쪽으로 관련짓습니다."

*ptr++        //Increment prt instead of what ptr point to.

//*(ptr++)와 같이 동작합니다.

올바른 방법은 다음과 같습니다.

(*ptr)++      //This will work.

*ptr += 1 : ptr이 가리키는 데이터를 증가시킵니다.* ptr++ : 포인터가 가리키는 데이터가 아닌 다음 메모리 위치를 가리키는 포인터입니다.

언급URL : https://stackoverflow.com/questions/35306391/difference-between-ptr-1-and-ptr-in-c

반응형