&a+1
#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]이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.