2015-01-03 8 views
1

http://www.cplusplus.com/reference/cstring/strchr/에있는 strchr 참조에서,이 예가 제공된다.char 포인터에서 char 배열을 빼면 int가 생성됩니까?

/* strchr example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] = "This is a sample string"; 
    char * pch; 
    printf ("Looking for the 's' character in \"%s\"...\n",str); 
    pch=strchr(str,'s'); 
    while (pch!=NULL) 
    { 
    printf ("found at %d\n",pch-str+1); 
    pch=strchr(pch+1,'s'); 
    } 
    return 0; 
} 

char 포인터 pch에서 char 배열 str을 뺀 않습니다 더하기 하나는 int을 제공? (%d 형식 유형으로 표시) "-str"을 제거하면 %d에서 %s으로 바뀔 때까지 프로그램이 실행되지 않습니다.

+2

배열은 표현식에서 사용될 때 포인터로 쇠퇴하며 포인터의 차이는 이들 사이의 거리 (요소 수)입니다. – zch

+0

@zch : 배열 의미론에 대한 OPs의 혼란을 해결해 주셔서 감사합니다. 그래도 그의 질문은 어떨까요? – Deduplicator

답변

3

그것의 짧은은이 버그에게있어입니다 : 표현 유형 int이 될 수도 있고, 당신이 printf에 호출 정의되지 않은 동작가있을 수 있습니다
있다.

은의가 단계적으로 보자

  1. 당신은 실제로 포인터에서 포인터의 배열,하지만 포인터를 뺀되지 않습니다 거의 모든 상황에서
    , array decays to a pointer to its first element을.

  2. 두 포인터의 차이점은 어떤 유형입니까? (동일한 배열의 요소를 가리키고있는 경우에만 정의됩니다)?

    ptrdiff_t (즉 <stddef.h>에서 그 typedef가 무엇인지입니다.)

  3. ptrdiff_tint을 될 일 수도 있지만에 의존하지 않습니다.
    대신 올바른 형식 지정자 %ti을 사용하십시오.

+1

대답 할 수있는 더 나은 결정이었습니다 (+1) –

+0

궁금한 점 : "배열 * 이름 * 썩어 짐"이란 무엇입니까? (단지 "배열 붕괴"대신에) 나는 여기 이것을 아주 자주 보았다. – mafso

+0

@mafso 자세한 설명은 해당 링크에서 편집하십시오. –

0

배열 이름은 첫 번째 요소에 대한 포인터 (대부분의 경우)로 감소합니다. 두 포인터를 뺄셈하면 ptrdiff_t 유형의 데이터가 생성되며 두 배열 모두 동일한 배열의 요소를 가리 킵니다.

-2

C/C++와 포인터가 이상하게 보입니다. 포인터와 배열 구문 및 의미는 간단히 말해서 간단합니다.

str은 char (및 배열)에 대한 포인터입니다. pch는 char에 대한 포인터이기도합니다.

두 개의 포인터를 같은 유형으로 빼면 그 사이의 요소 수를 얻습니다.

당신은 할 수

str[3] ; 

에 해당하고

*(str+3) ; 

귀하의 표현에 해당

3 [str] ; 

:

pch - 1 

에는 char에 대한 포인터 유형이 있습니다. 표현식

pch - str 

은 int 유형입니다.

+0

차이에 대한 ** 유형 **에 관한 OP 질문에 어떤 식 으로든 귀하의 게시물이 접촉하지 않습니다. 또한 포인터와 배열은 근본적으로 다른 것으로, 배열 붕괴가 있더라도 (또는 그 이상으로) 버그와 좌절의 근원이됩니다. – Deduplicator