이 프로그램의 출력을 이해할 수 없다?나는 내 프로그램은 아래와 같습니다
답변
그것은 동등의 :
*y = *z;
y++;
z++;
내가 당신 포인터를 인쇄하고이 프로그램
의 출력을 이해 못할 이해하기 많지 않다. 당신이 그 포인터를 증가 할 때
- 당신은 당신은 알려진 우주를 넘어 이동하고
%p
대신%d
의 인쇄 포인터를 사용한다 과 동일
:
*y = *z;
++z;
++y;
이것은 단순히 객체 poi의 값을 할당합니다. y
에 의해 z
에 의해 지시 된 객체의 그것들에 nted되고, 그 다음 두 포인터들을 증가시킨다.
y가 가리키는 객체의 값을 z가 가리키는 객체의 값에 할당하고 마지막으로 두 포인터를 증가시킵니다.
y
및 z
포인터, 그리고 표현 y++
및 z++
는 후위 연산자를 사용하는, 그래서 모두 증가는 할당 후 을 발생합니다. *y = *z
: 값이 같은 값이 z
가 가리키는 y
가리키는
- 를 할당에 :
이 문장은 3 일을한다.
y
포인터를 증가시킵니다. 지금y
은 다음을 가리키며int
을 메모리에 표시합니다.z
포인터를 증가시킵니다. 지금z
은 을 가리키고 다음은int
을 가리 킵니다.
y
및 z
가 문 다음에 사용 된 경우 마지막 두 나쁜 것 : y
및 z
이제 코드에 속하지 않는 초기화되지 않은 메모리를 가리 킵니다.
변수 y
및 z
은 정수를 가리키는 포인터이며,이 경우 변수 x의 주소를 가리 킵니다.
다음 라인들은 y
의 값을 x
의 주소 (즉, 주소)로 설정합니다.&x
는`x '의 주소를 제공합니다.
y=&x;
z=y
다음 줄, *y++=*z++;
정확히 이해하고 수도 있고 사용되는 컴파일러에 따라 컴파일되지 수 없습니다. GCC 4.3.2의 경우 다음과 같은 오류가 발생합니다.
foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’)
포인터 연산을하는 것처럼 보이지만 약간의 연산자 우선 순위가 있습니다. 사전 증가 값을 위치에 할당 한 후 z
이 가리키는 값을 증가 시키려고합니까?
"z = y"문에 대한 세미콜론을 놓쳤으므로이 오류가 발생합니다. – Ram
*y++=*z++;
- 포인터 z
에 저장된 값을 *y
에 할당하는 것입니다. 이 후 증가하는 y
및 z
포인터. 이 문을 z
및 y
모두 역 참조하면 충돌이 발생할 수 있습니다 (정의되지 않은 동작).
문 이런 종류
문자열 복사 구현에 사용되는void my_strcpy(char *dest, char* src)
{
while((*dest++ = *src++));
}
*y++=*z++; //wat does this mean?
(다음 시퀀스 지점 전에 여러 변형) 정의되지 않은 동작에 상기 결과.
- 1. 그러나 나는 코드가 아래와 같습니다 창
- 2. 갤러리에서 링크를 만드는 방법은 아래와 같습니다.
- 3. , 나는 아래와 같이 LINQ 쿼리를
- 4. XSD는 - 나는 XSD 파일을 아래와 같이이
- 5. 아래와 같이 나는 스크립트를 만들었습니다 어떻게 JQuery와
- 6. 나는 아래와 같은 URL을 구현하기 위해 노력하고있어
- 7. 나는 테이블 정의 아래와 같이이 MySQL의
- 8. 나는 아래와 같이 CC의 maillist 준비한
- 9. 는 RelativeLayout의 나는 RelativeLayout의 아래와 같이이
- 10. 나는 아래와 같은 수행 할 RGTK2
- 11. 나는 아래와 같은 PHP 코드가 PHP
- 12. 나는 아래와 같은 문장이 정규 표현식
- 13. 웹 소켓은 루프가 나는 코드를 아래와 같이이
- 14. 나는 아래와 같이 xml 파일이 SAXParser를
- 15. 나는 아래와 같은 파일들을 가지고 파이썬
- 16. 추가 내용이 나는 아래와 같이 jQuery를 조각이
- 17. 내 이클립스 프로그램은
- 18. 내 절차에서 아래와 같은 샘플 쿼리를 오라클
- 19. 워드 프레스 - 아래와 같이 나는 사용자 정의 포스트 유형을 만든
- 20. 왜 내 ASM 프로그램은 무한
- 21. 의 OpenMP와 SSE, 내 프로그램은
- 22. 내 안드로이드 응용 프로그램은 RuntimeException을
- 23. 아래와 같이
- 24. 정규식 나는 아래와 같은 패턴은 다음의 URL 뭔가가
- 25. 나는 아래와 같이 DataTemplate을 내부에 콤보 상자가 데이터 소스
- 26. 내 설정은 다음과 같습니다 CLI
- 27. 뭔가 아래와 같이,
- 28. 응용 프로그램은 Windows에서 "나는 비활성화 되었습니까?"
- 29. ASP.NET 응용 프로그램은 루트 응용 프로그램과 모양이 같습니다.
- 30. 내 user.rb은 다음과 같습니다 Authlogic
'y'와'z'는 모두'x'를 가리 킵니다. 그래서'x'를 자신에게 할당하고 있습니다. 그런 다음 두 포인터를 증가시킵니다. 그렇다면'printf'에 전달하여 정의되지 않은 동작을 일으키고 있습니다 만 포인터가 아닌'int'를 기대하는'% d' 변환을 사용합니다 (포인터를 출력하고'void *'로 변환 한 다음'%' p). –
@JerryCoffin 나는 이것에 녹슬 었어. 할당 된 공간 이상으로 가리 키도록하는 것이 합법적인가? – cnicutar
@cnicutar : 예. 포인터의 역 참조를하지 않는 한 배열의 끝을 지나서 하나를 가리킬 수 있습니다. (C99, §6.5.6/7) : "이 연산자의 목적 상, 포인터가 아닌 객체에 대한 포인터 배열의 요소는 객체의 유형이 요소 유형 인 길이가 1 인 배열의 첫 번째 요소에 대한 포인터와 동일하게 작동합니다. " –