int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("a = %u , &a = %u\n",a,&a);
printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}
a 및 &은 내부적으로 해석됩니까?"a"가 int 배열 일 때 "a + 1"과 "& a + 1"이 다른 결과를주는 이유는 무엇입니까?
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("a = %u , &a = %u\n",a,&a);
printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}
a 및 &은 내부적으로 해석됩니까?"a"가 int 배열 일 때 "a + 1"과 "& a + 1"이 다른 결과를주는 이유는 무엇입니까?
글쎄, a는 배열의 첫 번째 요소의 주소이고 &a는 배열의 주소이지만 분명히 둘 다 같은 주소를 가지고 있습니다.
그러나 포인터에서 숫자를 더할 때 (또는 빼기) 컴파일러는 데이터의 크기를 고려하므로 (int의 크기가 4 바이트라고 가정 할 때) a + 1은 a보다 큽니다. 4 포인터를 한 정수 앞에 놓기 때문에 & a + 1은 40만큼 커질 것입니다. 왜냐하면 포인터가 앞으로 10 개의 INTEGERS 배열을 더 많이 차지하기 때문입니다.
두 진술 모두 주소를 출력하며 포인터 계산을 설명하기위한 것입니다.
a
및 &a
은 동일하지 않으며 유형이 다르지만 동일한 메모리 주소를 보유합니다.
&a
그래서 1에서 그 유형을 유지 (배열에 대한 포인터와 같은 역할) 유형 int (*)[10]
a
는 (하나의 요소에 대한 포인터와 같은 역할) 타입 int [10]
입니다입니다 마음. 포인터는 주소에 포함 된 유형의 크기만큼 오프셋됩니다. a+1
은 int 크기, 즉 배열의 두 번째 요소만큼 오프셋합니다. &a+1
은 전체 배열을 완전히 지나치게 오프셋합니다.
거의 모든 것이 C에서 어떤 유형인지 : 산술 및 크기입니다. – mathk
완벽을 기하기 위해,'& a [0]'은'int *'타입이고'a'와 매우 비슷하게 동작 할 것이라고 덧붙이면 좋을 것입니다. – Hugues
@Brian R.Bondy 그래서 'sizeof'를 사용하여 유형의 차이점을 보여줄 수 있습니까? – sikisis