Namespaces
Variants

ptrdiff_t

From cppreference.net
< c ‎ | types
헤더 파일에 정의됨 <stddef.h>
typedef /*implementation-defined*/ ptrdiff_t ;

ptrdiff_t 는 두 포인터의 뺄셈 결과 의 부호 있는 정수 타입입니다.

ptrdiff_t 의 비트 너비는 17 이상입니다.

(C99부터)
(C23까지)

ptrdiff_t 의 비트 너비는 16 이상입니다.

(C23부터)

목차

참고 사항

ptrdiff_t 는 음수 값이 가능할 경우 포인터 연산과 배열 인덱싱에 사용됩니다. int 와 같은 다른 타입을 사용하는 프로그램은 인덱스가 INT_MAX 를 초과하거나 32비트 모듈러 연산에 의존하는 경우 64비트 시스템에서 실패할 수 있습니다.

동일한 배열의 요소들(배열의 끝 바로 다음을 가리키는 포인터 포함)을 가리키는 포인터들끼리만 서로 뺄셈할 수 있습니다.

배열이 매우 커서( PTRDIFF_MAX 요소보다 크지만 SIZE_MAX 바이트 이하인 경우) 두 포인터 간의 차이가 ptrdiff_t 로 표현될 수 없을 때, 이러한 두 포인터를 뺀 결과는 정의되지 않습니다.

char 배열의 길이가 PTRDIFF_MAX 보다 짧은 경우, ptrdiff_t size_t 의 부호 있는 대응 타입으로 작동합니다: 모든 타입의 배열 크기를 저장할 수 있으며 대부분의 플랫폼에서 intptr_t 와 동의어입니다).

가능한 구현

typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // C23부터 유효함

예제

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
int main(void)
{
    const size_t N = 100;
    int numbers[N];
    printf("PTRDIFF_MAX = %ld\n", PTRDIFF_MAX);
    int *p1 = &numbers[18], *p2 = &numbers[23];
    ptrdiff_t diff = p2 - p1;
    printf("p2-p1 = %td\n", diff);
}

가능한 출력:

PTRDIFF_MAX = 9223372036854775807
p2-p1 = 5

참조문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.19 공통 정의 <stddef.h> (p: TBD)
  • 7.20.3 다른 정수형의 한계 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.19 공통 정의 <stddef.h> (p: 211)
  • 7.20.3 다른 정수형의 한계 (p: 215)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.19 공통 정의 <stddef.h> (p: 288)
  • 7.20.3 기타 정수형의 한계 (p: 293)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.17 공통 정의 <stddef.h> (p: 253)
  • 7.18.3 기타 정수형의 한계 (p: 258)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.1.6 공통 정의 <stddef.h>

참고 항목

sizeof 연산자가 반환하는 부호 없는 정수형
(typedef)
구조체 타입의 시작부터 지정된 멤버까지의 바이트 오프셋
(function macro)
C++ documentation for ptrdiff_t