&a+1

1121 단어
다음 프로그램의 출력 결과는 얼마입니까?
#include "stdafx.h"    
#include <iostream>    
using namespace std;    
int _tmain(int argc, _TCHAR* argv[])    
{    
    int a[5]={1,2,3,4,5};    
    int *ptr=(int*)(&a+1);    
    printf("%d,%d
",*(a+1),*(ptr-1)); printf("a %x,&a %x
",a,&a); return 0; }

정답: 출력: 2, 5
*(a+1)는 a[1], *(ptr-1)는 a[4], 집행 결과는 2, 5
& a+1은 첫 번째 주소 +1이 아닙니다. 시스템은 a수 그룹의 편이를 추가한 것으로 보고 한 수 그룹의 크기를 편향합니다. (이 예는 5개int입니다)
int *ptr = (int *)(&a+1);
ptr는 사실상 & (a[5]), 즉 a+5
이유는 다음과 같습니다.
&a는 수조 지침으로 그 유형은 int(*)[5]이다.
포인터 플러스 1은 포인터 유형에 따라 일정한 값을 더해야 하며, 서로 다른 유형의 포인터 +1 이후 증가하는 크기가 다르다(포인터 유형의 길이가 증가한다).
a는 길이가 5인 int수 그룹 포인터이기 때문에 5*sizeof (int) 를 추가합니다.
따라서 ptr는 실제적으로 ptr[5],
그러나 ptr는 (&a+1) 유형과 다르다. (이 점은 매우 중요하다. ptr는 int* 유형이고 (&a+1) 는 int(*)[5] 유형이다)
그래서 ptr-1은sizeof(int*)만 뺀다.
특히 주의: a, &a의 주소는 같지만 뜻은 다르다. a는 수조의 첫 번째 주소, 즉 a[0]의 주소이고 &a는 대상(수조)의 첫 번째 주소이다.a+1은 수조 다음 요소의 주소, 즉 a[1], &a+1은 다음 대상의 주소, 즉 a[5]이다.

좋은 웹페이지 즐겨찾기