문제

다음 코드가 있다고 가정합니다.

int main(){
    int a[3]={1,2,3};
    printf("      E: 0x%x\n", a);
    printf("  &E[2]: 0x%x\n", &a[2]);
    printf("&E[2]-E: 0x%x\n", &a[2] - a);
    return 1;
}

컴파일 및 실행시 결과는 다음과 같습니다.

      E: 0xbf8231f8
  &E[2]: 0xbf823200
&E[2]-E: 0x2

나는 결과를 이해한다 & E [2 8 플러스 배열 주소는 2로 인덱스되고 유형 int (32 비트 시스템의 4 바이트)이지만 마지막 줄이 8 대신 2 인 이유를 알 수 없습니까?

또한 정수 또는 정수 포인터는 어떤 유형의 마지막 줄이어야합니까?

이 퀴크를 만드는 것이 C 유형 시스템 (Kinda Casting)인지 궁금합니다.

도움이 되었습니까?

해결책

당신은 표현이 무엇인지 기억해야합니다 a[2] 정말 의미가 있습니다. 정확히 동일합니다 *(a+2). 너무 많이, 글을 쓰는 것이 완벽하게 합법적입니다. 2[a] 대신, 동일한 효과로.

그것이 작동하고 이해하기 위해, 포인터 산술은 지적한 것의 유형을 고려합니다. 그러나 그것은 무대 뒤에서 처리됩니다. 당신은 단순히 배열에 자연스러운 오프셋을 사용하면 모든 세부 사항이 작동합니다.

동일한 논리가 포인터 차이에 적용되며, 이는 결과를 설명합니다. 2.

후드 아래에서, 당신의 예에서, 당신의 예에서 인덱스에 곱합니다. sizeof(int) 배열의 기본 주소에 추가되는 바이트 오프셋을 가져옵니다. 주소의 두 인쇄물에 해당 세부 사항을 노출시킵니다.

다른 팁

동일한 유형의 포인터를 빼면 결과는 바이트 수가 아닌 요소의 수입니다. 이것은 디자인에 의한 것이므로 모든 유형의 배열을 쉽게 색인 할 수 있습니다. 바이트 수를 원한다면 주소를 char*에 캐스트합니다.

포인터를 1 (p + 1) 씩 증가시킬 때 포인터는 (p + sizeof (type)) 바이트를 p. (유형이 int 인 경우 p+sizeof (int))

비슷한 논리는 P-1에도 적합합니다 (물론이 경우 빼기).

여기에 해당 원칙을 적용하는 경우 :

간단히 :

a[2] can be represented as (a+2)
a[2]-a      ==>  (a+2) - (a)    ==> 2

그래서 현장 뒤에서

a[2] - a[0]  
==> {(a+ (2* sizeof(int)) ) - (a+0) }  / sizeof(int) 
==> 2 * sizeof(int) / sizeof(int) ==> 2

Line & E [2] -2는 정수 뺄셈이 아니라 포인터 뺄셈을 수행하고 있습니다. 포인터 뺄셈 (두 포인터가 동일한 유형의 데이터를 가리킬 때)은 주소의 차이를 가리키는 유형의 크기로 나눈 값을 반환합니다. 반환 값은 int입니다.

"업데이트"질문에 답하기 위해 다시 한 번 포인터 산술 (이번에는 포인터 추가)이 수행되고 있습니다. 포인터가 가리키는 연속 데이터 덩어리를 쉽게 "인덱싱"하기 위해 C에서 이러한 방식으로 수행됩니다.

당신은 관심이있을 수 있습니다 c.의 포인터 산술 질문과 답변.

기본적으로 + 및 - 연산자는 포인터에 사용될 때 요소 크기를 고려합니다.

C에서 포인터를 추가하고 빼면 절대 주소가 아닌 데이터 유형의 크기를 사용합니다.

int pointer가 있고 숫자 2를 추가하면 2 * sizeof (int)를 발전시킵니다. 같은 방식으로 두 개의 int 포인터를 빼면 절대 주소의 차이보다는 (int) 크기 단위로 결과를 얻게됩니다.

(데이터 유형의 크기를 사용하여 포인터가 있으면 매우 편리하므로 예를 들어 단순히 사용할 수 있습니다. p++ 매번 유형의 크기를 지정하는 대신 : p+=sizeof(int).)

Re : "추가에서는 마지막 줄의 어떤 유형은 정수 또는 정수 포인터입니까 ??"

정수/번호. 같은 토큰으로 : 오늘 -4 월 1 일 = 숫자. 날짜가 아닙니다

바이트 차이를 보려면 다음과 같이 1 바이트 크기의 유형이 필요합니다.

printf("&E[2]-E:\t0x%x\n",(char*)(&a[2])-(char*)(&a[0]))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top