2013-07-18 5 views
2

웹에서 소스 코드를 얻었지만 한 줄이 모호합니다.++에서 operator가 char에서 수행하는 작업 *

double dict(const char *str1, const char *str2) { 

하고이 기능에서 선 : 나는 기능이

if (strlen(str1) != 0 && strlen(str2) != 0) 
    while (prefix_length < 3 && equal(*str1++, *str2++)) prefix_length++; 

str1과 *에서 운영자 어떻게 ++ 않습니다 ++과 *과 str2를 ++?

+0

에 대한 포인터의 다음 주소를 반환합니다. –

+0

주 :'* (str ++);'표현식에서,'++'의 우선 순위가'*'추론 연산자보다 높기 때문에 괄호는 중복됩니다. –

답변

5

포인터를 증가시킵니다 (가리키는 포인터가 아닙니다). 둘 다 str가 증가가 발생하기 전에에서 지적하는 문자를 반환하지만

(*str)++; /* Increment the character pointed at by str */ 
*str++; /* Increment the pointer in str */ 
*(str++); /* Increment the pointer in str - the same, but verbose */ 

는 매우 다른 두 가지입니다.

1

*str1++arr[1] 의 주소를 가리 것이다

  1. CH가 'm'
  2. str 포함될 명령문 이상 실행 한 후, 먼저 value pointed by str1 사용하고 지금 str1

    char arr[] = "meow"; 
    char ch; 
    
    char *str = arr; 
    
    ch = *str++; // ch = *(str++) both does same 
    

    증분 수단

+0

* 기침 * 연산자 우선 순위 * 기침 * –

+0

실제로 포인터는 역 참조되고 증분되며 아마도 VoidPointer의 의미일까요? – Nobilis

+0

예 @ 노빌리스, 나는 그랬다. – VoidPointer

2

*str1++을 읽거나 쓸 때 후위 증가분에 대한 일반 규칙이 적용됩니다. 즉 :

  1. 포인터는 이전 포인터 값이 (이전 증가로 값이다) 포인터 값 역 참조 그 단계 당신

을 반환 다음 주소

  • 으로 증가하고 그것이 가리키는 값을 사용하십시오. 당신은 또한 (+2) 증가처럼, 그 위에 산술 연산을 수행 할 수 있도록

  • 0
    C

    (일부 파생 된 언어)를 char 유형 (도 ++number 유형 (수는 256 개 다른 값을 포함하는 작은 하나)입니다) 등등.

    이 경우 ++ 연산자는 char을 증가시키지 않고이 char에 대한 포인터를 증가시킵니다.

    *str2++ 메모리의 다음 객체에에게 포인트를 만드는 포인터를 증가 str2