수색…


포인터 값을 개체에 인쇄하기

함수 포인터 대신 객체에 대한 포인터의 값을 출력하려면 p 변환 지정자를 사용하십시오. 이것은 void -pointer 만 출력하도록 정의되었으므로, void 가 아닌 값을 출력하려면 명시 적으로 void* 로 변환 ( "casted *")해야합니다.

#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h>  /* for printf() */

int main(void)
{
  int i;
  int * p = &i;

  printf("The address of i is %p.\n", (void*) p);

  return EXIT_SUCCESS;
}
C99

<inttypes.h>uintptr_t

C99 이상에서 포인터를 인쇄하는 또 다른 방법은 uintptr_t 유형과 <inttypes.h> 의 매크로를 사용하는 것입니다.

#include <inttypes.h> /* for uintptr_t and PRIXPTR */
#include <stdio.h>    /* for printf() */

int main(void)
{
  int  i;
  int *p = &i;

  printf("The address of i is 0x%" PRIXPTR ".\n", (uintptr_t)p);

  return 0;
}

이론적으로 정수로 변환 된 포인터를 보유 할 수있는 정수 유형이 없기 때문에 uintptr_t 유형이 존재하지 않을 수 있습니다. 실제로 그것은 존재합니다. 함수에 대한 포인터는 uintptr_t 유형으로 변환 할 필요가 없습니다. 그러나 가장 자주 변환 할 수도 있습니다.

uintptr_t 유형이 존재하면 intptr_t 유형도 존재합니다. 주소를 부호있는 정수로 취급하려는 이유가 명확하지 않습니다.

K & R C89

표준 전 기록 :

K & R-C 시대 이전의 C89 이전에는 void* (헤더 <stdlib.h> 도 프로토 타입도 없었고 int main(void) 표기도 없었습니다.) 포인터가 long unsigned int 로 캐스팅되었고 lx 길이 수정 자 / 변환 지정자.

아래의 예는 정보를 제공하기위한 것입니다. 요즘은이 코드가 유효하지 않아 불명확 한 정의되지 않은 동작을 유발할 수 있습니다.

#include <stdio.h> /* optional in pre-standard C - for printf() */

int main()
{
  int  i;
  int *p = &i;

  printf("The address of i is 0x%lx.\n", (long unsigned) p);

  return 0;
}

개체에 대한 두 포인터 값의 차이점 인쇄

객체에 대한 두 포인터의 값을 빼면 부호있는 정수 * 1이 됩니다. 따라서 적어도 d 변환 지정자를 사용하여 인쇄됩니다.

C99 <stddef.h>ptrdiff_t 유형을 정의하기 때문에 이러한 "포인터 차이"를 수용 할만큼 충분히 넓은 유형인지 확인합니다. ptrdiff_t 를 인쇄하려면 t 길이 수정자를 사용하십시오.

C99
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h> /* for printf() */
#include <stddef.h> /* for ptrdiff_t */


int main(void)
{
  int a[2];
  int * p1 = &a[0], * p2 = &a[1];
  ptrdiff_t pd = p2 - p1;

  printf("p1 = %p\n", (void*) p1);
  printf("p2 = %p\n", (void*) p2);
  printf("p2 - p1 = %td\n", pd);

  return EXIT_SUCCESS;
}

결과는 다음과 같습니다.

p1 = 0x7fff6679f430
p2 = 0x7fff6679f434
p2 - p1 = 1

차이의 결과 값은 포인터를 빼는 점의 유형 크기 ( int 됩니다. 이 예제의 int 크기는 4입니다.


* 1 빼는 두 포인터가 같은 객체를 가리 키지 않으면 그 동작은 정의되지 않습니다.

인쇄용 변환 지정자

변환 지정자 인수의 유형 기술
i , d int 십진수를 인쇄하다
u 부호없는 정수 십진수를 인쇄하다
o 부호없는 정수 8 진수를 출력한다.
x 부호없는 정수 16 진수, 소문자를 인쇄합니다.
X 부호없는 정수 16 진수, 대문자로 인쇄합니다.
f 더블 정밀도를 지정하지 않으면 float를 기본 정밀도 6으로 인쇄합니다 (특수 숫자 naninf 또는 infinity 에는 소문자가 사용됩니다)
F 더블 정밀도를 지정하지 않으면 float를 기본 정밀도 6으로 인쇄합니다 (대문자 NANINF 또는 INFINITY 대문자 사용).
e 더블 가수 / 지수를 사용하는 과학 표기법을 사용하여 정밀도가 제공되지 않으면 float를 기본 정밀도 6으로 인쇄합니다. 소문자 지수 및 특수 숫자
E 더블 가수 / 지수를 사용하는 과학 표기법을 사용하여 정밀도가 제공되지 않으면 float를 기본 정밀도 6으로 인쇄합니다. 대문자 지수 및 특수 숫자
g 더블 f 또는 e 사용합니다 [아래 참조]
G 더블 F 또는 E 중 하나를 사용합니다 [아래 참조]
a 더블 16 진수, 소문자를 인쇄합니다.
A 더블 16 진수, 대문자로 인쇄합니다.
c 단일 문자를 인쇄합니다.
s 숯* NUL 종결 자까지 문자열을 출력하거나, 지정된 경우 정밀도로 주어진 길이로 잘립니다.
p 빈* void -pointer 값을 출력한다; 비 void -pointer는 명시 적으로 void* 로 변환 ( "캐스트")해야합니다. 객체 포인터 만, 함수 포인터는 아니다 .
% 해당 없음 % 문자를 인쇄합니다.
n int * 지금까지에 인쇄 된 바이트 수를 쓰기 int 향하고있다.

ISO / IEC 9899 : 2011 §7.21.6.1 ¶7에 따라 길이 변경자는 %n 적용될 수 있습니다 (예 : %hhn다음 n 변환 지정자가 signed char 인수에 대한 포인터에 적용됨을 나타냄).

부동 소수점 변환은 기본 승격 규칙 때문에 floatdouble 유형에 적용됩니다. §6.5.2.2 함수 호출, ¶7 함수 프로토 타입 선언자의 줄임표 표기법을 사용하면 마지막으로 선언 된 매개 변수 다음에 인수 유형 변환이 중지됩니다. 기본 인수 승격은 후행 인수에서 수행됩니다. ) 따라서 printf() 와 같은 printf() 는 참조 된 변수가 float 유형 인 경우에도 double 값만 전달됩니다.

gG 형식을 사용하면 ef (또는 EF ) 표기법 중 선택은 C 표준 및 printf() 에 대한 POSIX 사양에 설명되어 있습니다.

부동 소수점 수를 나타내는 double 인수는 변환 된 값과 정밀도에 따라 스타일 f 또는 e (또는 G 변환 지정자의 경우 스타일 F 또는 E )로 변환되어야합니다. 0이 아닌 경우 P 는 정밀도와 같고, 정밀도가 생략되면 6, 정밀도가 0이면 1입니다. 그런 다음 스타일 E 하는 변환의 지수가 X :

  • P> X> = -4 인 경우, 변환은 스타일 f (또는 F ) 및 정밀도 P - (X+1) 됩니다.
  • 그렇지 않으면, 변환은 스타일 e (또는 E )와 정밀도 P - 1 이루어져야한다.

마지막으로, '#'플래그가 사용되지 않는 한, 끝에 오는 0은 결과의 분수 부분에서 제거되어야하고 소수 부분이 남아 있지 않으면 소수점 문자는 제거되어야합니다.

printf () 함수

<stdio.h> 포함을 통해 액세스되는 printf() 함수는 C의 콘솔에 텍스트를 인쇄하는 데 사용되는 기본 도구입니다.

printf("Hello world!");
// Hello world!

일반 포맷되지 않은 문자 배열은 괄호 사이에 직접 배치하여 직접 인쇄 할 수 있습니다.

printf("%d is the answer to life, the universe, and everything.", 42);
// 42 is the answer to life, the universe, and everything.

int x = 3;
char y = 'Z';
char* z = "Example";
printf("Int: %d, Char: %c, String: %s", x, y, z);
// Int: 3, Char: Z, String: Example

다른 방법으로, 정수, 부동 소수점 숫자, 문자 등은 이스케이프 문자 % 사용하여 인쇄 할 수 있으며 문자 다음에 형식 지정자 로 알려진 형식을 나타내는 문자 시퀀스가 ​​뒤 따릅니다.

printf() 함수에 대한 모든 추가 인수는 쉼표로 구분되며 이러한 인수는 형식 지정자와 동일한 순서 여야합니다. 잘못 입력 된 인수 나 인수가 부족하면 오류 또는 정의되지 않은 동작이 발생하지만 추가 인수는 무시됩니다. 각 인수는 리터럴 값이나 변수가 될 수 있습니다.

성공한 실행 후, 인쇄 된 문자의 수는 int 유형으로 리턴됩니다. 그렇지 않으면, 실패는 음수 값을 리턴합니다.

길이 수정 자

C99 및 C11 표준은 printf() 대해 다음 길이 수정자를 지정합니다. 그 의미는 다음과 같습니다.

모디파이어 수정하다 적용 대상
hh d, i, o, u, x 또는 X char , signed char 또는 unsigned char
h d, i, o, u, x 또는 X short int 또는 unsigned short int
d, i, o, u, x 또는 X long int 또는 unsigned long int
a, A, e, E, f, F, g 또는 G double ( scanf() 와의 호환성을 위해, C90에서는 정의되지 않음)
어울리다 d, i, o, u, x 또는 X long long int 또는 unsigned long long int
j d, i, o, u, x 또는 X intmax_t 또는 uintmax_t
d, i, o, u, x 또는 X size_t 또는 해당 서명 된 유형 (POSIX의 ssize_t )
d, i, o, u, x 또는 X ptrdiff_t 또는 대응하는 부호없는 정수 유형
a, A, e, E, f, F, g 또는 G long double

길이 수정자가 위에 지정된 것과 다른 변환 지정자와 함께 표시되면 동작은 정의되지 않습니다.

Microsoft는 다른 길이 수정자를 지정하고 명시 적으로 hh , j , z 또는 t 지원하지 않습니다.

모디파이어 수정하다 적용 대상
I32 d, i, o, x 또는 X __int32
I32 o, u, x 또는 X unsigned __int32
I64 d, i, o, x 또는 X __int64
I64 o, u, x 또는 X unsigned __int64
나는 d, i, o, x 또는 X ptrdiff_t (32 비트 플랫폼에서는 __int32 , 64 비트 플랫폼에서는 __int64 )
나는 o, u, x 또는 X size_t (32 비트 플랫폼에서는 unsigned __int64 unsigned __int32 , 64 비트 플랫폼에서는 unsigned __int64 )
L 또는 L a, A, e, E, f, g 또는 G long double (Visual C ++에서 long double 은 고유 한 형식이지만 long double 과 동일한 내부 표현 double 집니다.)
l 또는 w C 또는 C printfwprintf 기능을 갖춘 넓은 문자. ( lc , lC , wc 또는 wC 형식 지정자는 printf 함수에서 Cwprintf 함수에서 c 와 동의어입니다.)
l 또는 w s, S 또는 Z printfwprintf 기능이있는 넓은 문자열입니다. ( ls , lS , ws 또는 wS 유형 지정자는 printf 함수에서 Swprintf 함수에서 s 와 동의어입니다.)

C , SZ 변환 지정자와 I , I32 , I64w 길이 수정자는 Microsoft 확장입니다. 치료 l 위한 수정 같은 long double 이 아니라 double 당신이하지 않는 한 차이를 발견하기 위해 하드 누르면됩니다 불구하고, 표준과 다른 long double 과는 다른 표현이 double .

형식 플래그 인쇄

C 표준 (C11 및 C99도)은 printf() 대해 다음과 같은 플래그를 정의합니다.

깃발 전환 수 의미
- 모든 변환 결과는 필드 내에서 왼쪽 맞춤이됩니다. 이 플래그가 지정되지 않으면 변환이 오른쪽 정렬됩니다.
+ 부호가있는 숫자 부호 변환의 결과는 항상 부호 ( '+'또는 '-')로 시작됩니다. 이 플래그가 지정되지 않으면 음수 값이 변환 될 때만 변환이 부호로 시작됩니다.
<space> 부호가있는 숫자 서명 된 변환의 첫 번째 문자가 부호가 아니거나 부호가있는 변환 결과 문자가없는 경우 결과에 <space> 가 접두사로 사용됩니다. 즉, <space> 및 ' + '플래그가 모두 표시되면 <space> 플래그는 무시됩니다.
# 모든 값을 대체 양식으로 변환하도록 지정합니다. o 변환의 경우, 필요한 경우에만 결과의 첫 번째 숫자가 0이되도록 정밀도를 높입니다 (값과 정밀도가 모두 0이면 하나의 0이 인쇄됩니다). x 또는 X 변환 지정자의 경우, 0이 아닌 결과의 앞에는 0x (또는 0X )가 붙습니다. 들면 , , a A e , E , f , F , gG 변환 지정자, 결과는 항상 어떤 숫자가 기수 문자를 수행하지 않는 경우에도, 기수 문자를 포함한다. 이 플래그가 없으면 숫자가 뒤따라야 만 이러한 변환 결과에 기수 문자가 나타납니다. gG 변환 지정자의 경우 후미에있는 0은 정상적으로 결과에서 제거되지 않습니다. 다른 변환 지정자의 경우 동작은 정의되지 않습니다.
0 숫자의 d, i, o, u, x, X, a, A, e, E, f, F, g 및 G 변환 지정자의 경우 앞에 오는 0 (부호 또는 기준 표시 이후) 무한대 또는 NaN을 변환 할 때를 제외하고는 스페이스 패딩을 수행하는 대신 폭을 사용합니다. '0'및 '-'플래그가 모두 표시되면 '0'플래그가 무시됩니다. d, i, o, u, x 및 X 변환 지정자의 경우, 정밀도가 지정되면 '0'플래그는 무시됩니다. ''0 '및 <apostrophe> 플래그가 모두 표시되면 그룹화 문자가 제로 패딩 전에 삽입됩니다. 다른 전환의 경우 동작이 정의되지 않습니다. ⌫

이 플래그는 Microsoft 에서도 동일한 의미로 지원됩니다.

printf() 대한 POSIX 사양은 다음을 추가합니다.

깃발 전환 수 의미
' i, d, u, f, F, g, G 10 진수 변환 결과의 정수 부분은 수천 개의 그룹화 문자로 형식화되어야합니다. 다른 변환의 경우 동작이 정의되지 않습니다. 비 화폐 그룹화 문자가 사용됩니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow