아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
심심한타조259
심심한타조25921.03.15

[C] 아래 코드에서 출력되는 값들의 차이점이 무엇인가요?

#include<stdio.h>

int main(){

int a[5]={1,10,2,7,9};

printf("%d ",&a[1]-&a[4]); //-3

printf("%d ",(int)(&a[1])-(int)(&a[4])); //왜 -3이 아니고 12인가요?

printf("%d ",(int)((&a[1])-(&a[4]))); //-3

return 0;

}

위 3개 차이가 무엇인가요?

55글자 더 채워주세요.
답변의 개수
3개의 답변이 있어요!
  • 답변이 확실하다고 볼 수 없지만 답변을 하자면 이렇습니다.

    printf("%d ",(int)(&a[1])-(int)(&a[4]));

    이 부분이 왜 -3이 아니고 12인 이유는 메모리 주소값을 계산하였기 때문으로 보입니다.

    따로 printf 함수를 통하여 printf("%d \n", (int)&a[4]); 이런 식으로 출력을 해보면 108063328 이런 메모리 주소값이 나오게 되는데

    저 메모리 주소값이 a[1]과 a[4]의 주소값 차이가 12가 나기 때문에 계산 값이 12로 나오는 것으로 보입니다.

    printf("%d ",&a[1]-&a[4]); 와 printf("%d ",(int)((&a[1])-(&a[4]))); 는 배열 순서값([1]-[4])을 뺀 것으로 보입니다.


  • 해당 배열의 시작 주소를 0x1000이라고 해보겠습니다.

    a[0]의 주소는 0x1000, a[1] 의 주소는 0x1004, a[2]의 주소는 0x1008로 배정 됩니다.

    int size가 32Bit이기 때문에 4byte씩 떨어져서 연속된 형태로 위치하게 됩니다.

    포인터 끼리 뺄 때는 자료형의 크기를 가진 데이터가 몇개인지로 값이 계산됩니다.

    1. printf("%d ",&a[1]-&a[4]); 는 -3이 나오게 됩니다.

    2. printf("%d ",(int)(&a[1])-(int)(&a[4]));

    -> 해당 연산은 포인터 연산에서 정수 연산으로 바뀌었기 때문에 두 주소값의 실제 차이인 -12가 나오게 됩니다.

    3. printf("%d ",(int)((&a[1])-(&a[4])));
    -> -3이나온 상태에서 타입 캐스팅을 한것이기 때문에 값은 -3으로 바뀌지 않고 나옵니다.


  • 안녕하세요. 아하(a-ha) 프로그래밍 지식 답변자 입니다.

    해당 현상은 포인터와 관련된 현상 입니다.

    // 배열에서 9와 10의 주소는 3집 건너 이기 때문에 -3 입니다. printf("%d ",&a[1]-&a[4]); //-3 // 주소를 int 로 변환했습니다. // int는 4byte 입니다. // 따라서 int a[5]={1,10,2,7,9} 배열의 상대적 주소는 순서대로 0, 4, 8, 12, 16 입니다. // 주소를 int로 변환했기 때문에 4 - 16 = -12 가 되는 경우 입니다. printf("%d ",(int)(&a[1])-(int)(&a[4])); //왜 -3이 아니고 12인가요? // 첫 번째 예시에서 -3 나온것을 단순히 int 처리 했으므로 -3 입니다. printf("%d ",(int)((&a[1])-(&a[4]))); //-3

    답변이 도움이 됐으면 좋겠습니다. 좋은 하루 되세요!