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+=1
post-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
'programing' 카테고리의 다른 글
PHP에서 추상 클래스는 무엇입니까? (0) | 2022.11.10 |
---|---|
Python 3의 sys.maxint란 무엇입니까? (0) | 2022.11.10 |
Vuex 상태 boolen 속성이 정의되지 않음으로 표시됨 (0) | 2022.11.10 |
자바에서는 같은 캐치블록에서 두 개의 예외를 잡을 수 있습니까? (0) | 2022.11.10 |
java.lang에 대해서Thread.State: WAITING(주차) (0) | 2022.11.10 |