2012-04-03 2 views
0

나는 C에서 초보자이야와의 나는 다음과 같은 코드가 있다고 가정 해 봅시다 :s ++와 * s ++ 사이에 차이점이 있습니까?

#include <stdio.h> 
void test(char *t) 
{ 
    t++; 
    *t = 'e'; 
} 

void main() 
{ 
    char a[] = "anto"; 
    printf("%c\n",a[1]); 
    test(a); 
    printf("%c\n",a[1]); 
} 

이 내가 어떻게 포인터 작업을 파악하고있는 샘플 코드입니다. 나에게 문을 따르면 위의 코드에서

t++; 

하면 호출하는 함수 test에서 1char에 의해 배열 a의 주소를 증가합니다. 좋아, 지금까지 나는 *이 포인터가 가리키는 객체 값을 검색하는데 사용된다는 것을 알고있다.

그러나 이상하게 나는이 t++

*t++; 

에 내가 이전과 동일한 출력을 얻고 변경할 때. 나는 문자 그대로 *t++;이 내용을 바꿔야 만한다는 사실과 혼동하고있다. 이것은 * 연산자의 정의에 따른다.

하지만 다시 주소가 t이됩니다. 어째서? 내가 컨셉을 잘못하고있는 곳? ++ 여전히 포인터가 아닌 내용에 적용 - 사전

+5

참고 : 항상 경고를 사용하여 컴파일하십시오 (예 : 'gcc -Wall'. 그리고 * 그 경고를 읽고주의를 기울이십시오. –

+0

널 포인터에 대해 수학을하는 IIRC는 정의되지 않은 결과를 가지지 만 널 포인터를 역 참조하는 것은 정의되지 않은 동작을합니다. 그래서 차이가 있지만 t가 null 인 경우에만 나타납니다. – harold

+0

@PaulR : 조언 해 주셔서 감사합니다. –

답변

10

표현 *t++*(t++)로 구문 분석에

감사합니다. t++의 값은 증가하기 전의 포인터 자체의 값이며, *t++의 값은 증가 이전에 포인터가 가리키는 값입니다.

+0

에 대한 몇 가지 관련 질문을 찾을 수있을 것입니다.이 질문은 OP의 질문 –

+0

에 실제로 실제로 대답 하리라 생각하지 않지만 올바른 답변입니다. 2. (모두에게) : const 값을 증가시킬 수 없기 때문에,이게 왜 'const char *'로도 속일 수있는 이유입니다.하지만 포인터로 그렇게 할 수 있습니다. –

+0

답변을 주셔서 감사합니다 ... 이제 저는 분명합니다 ... –

2

++*보다 우선하여 더하기식이 *(t++)으로 계산됩니다.

4

(*) 연산자는 포인터를 역 참조하는 데 사용됩니다. 성명으로

t++; 

*t++; 

로 t 포인터를 증가하기 전에 지적되는 값을 반환 포인터의 이전 위치를 반환합니다.

두 명령문의 부작용은 동일하므로 동일한 출력을 얻고 있습니다.

*t++; 

문은 값 (t)가 ++ 연산자는 * 연산자보다 큰 우선 순위를 가지고 있기 때문에 가리키는 변경되지 않습니다.

1

접미어 ++은 단 하나보다 높은 우선 순위를 가지고 있으므로 *t++*(t++)으로 구문 분석됩니다. 당신은 표현의 결과를 역 참조합니다. t++; 부작용으로 t이 향상되었습니다.

단항 * 및 단항 ++같은 우선 순위를 가지고, 그래서 그들은 같은 표현에 표시 한 경우에는 왼쪽에서 오른쪽으로 평가 될 것이다.*++t이라는 표현식은 *(++t)으로 구문 분석됩니다. 표현 ++t의 결과를 역 참조하고, 부작용으로서 t이 고급입니다.

++*t++(*t)으로 구문 분석됩니다. 표현 *t의 결과를 증가시킵니다.

관련 문제