주소

2011-12-07 2 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

출력 :주소

0045FB88 0045FB88 
0045FB88 0045FB7C 

u의 출력을 의미한다.

나는 t&t[0]이 동일한 값을 가져야한다는 것을 이해하지만, &t도 같은 방식으로 나타납니다. &는 실제로 무엇을 의미합니까?

+4

¤ 포인터로 변환 된 't'와 '& t'의 유일한 차이점은 포인터 유형입니다. 후자의 지시 대상은 형식적으로 배열 유형이므로, 1을 더하면 메모리에서 다음 배열로 이동합니다.전자의 지시 대상은 요소 유형입니다. 용어 : [comp.lang.C++] 유즈넷 그룹에서, 'u'와 같은 포인터가 배열을 "가리키는"것이라고 말할 수 있는지에 대한 논란이있었습니다. 그 지시 대상은 배열 타입이 아니기 때문입니다. 그것은 표준의 그러한 표현의 사용을 지적함으로써 끔찍하게 해결되었습니다. 건배 & hth., –

+0

@alf는 그 질문으로 주위에 고생하고있는 그 paul 사람을 wasnt한다? –

+0

@ JohannesSchaub-litb : 예 –

답변

18

표현식에서 t을 단독으로 사용하면 배열 대 포인터 변환이 수행되고 배열의 첫 번째 요소에 대한 포인터가 생성됩니다.

t& 연산자의 인수로 사용되면 해당 변환이 수행되지 않습니다. &은 명시 적으로 주소 t (배열)을 취합니다. &t은 배열 전체에 대한 포인터입니다.

배열의 첫 번째 요소는 전체 배열의 시작과 같은 위치에 있으므로이 두 포인터는 같은 값을 갖습니다.

+0

감사합니다. 포인터가되는'u '라는 잘못된 생각을 내포 한 암시 적 배열 - 포인터 변환이라고 가정합니다. – quuxbazer

+0

@quuxbazer :'u'_는 포인터입니다. 't'는 배열입니다. 'int * u = t'는 배열 - 포인터 변환을't'에 적용하고 결과를'u'로 초기화합니다. – Mankarse

+0

-1 이것은 C++에 대한 잘못된 설명입니다. –

0

t은 배열의 주소이고 &t은 배열에 대한 정적 포인터이므로 표시된 주소는 동일합니다.

나는이 개념을 매우 잘 설명하는 cplusplus forum을 발견했습니다.

가 언급 한 바와 같이 약 &array :

이 규칙이 적용되지 않는 예외 중 하나입니다. 배열에 대한 포인터로 사용합니다. 다시 배열의 첫 번째 요소를 가리키지 만이 포인터에 포인터를 추가하면 배열을 건너 뛰는 것처럼 배열의 마지막 요소 바로 다음 위치의 주소를 가리 킵니다.

+1

-1 "& t는 배열의 첫 번째 주소에 대한 참조입니다."올바르지 않습니다. –

+0

@ AlfP.Steinbach 어떻게됩니까? & t는 배열에서 사용되는 메모리 블록의 시작 부분에 대한 참조이므로 배열의 첫 번째 주소에 대한 참조입니다. – Serdalis

+0

'& t'은 참조가 아닙니다. 이것은 포인터 값입니다. 배열에 대한 참조를 가질 수 있지만 "& t"는 그렇게 할 수 없습니다. –

-2

t 변수는 변경할 수 없으므로이 변수가 없습니다. t이라는 이름은 첫 번째 요소의 주소를 참조하기 만합니다 (또한 크기가 연관되어 있음). 따라서 주소의 주소를 가져 오는 것이 실제로 의미가 없으며 C는 단순히 주소가되는 것을 "붕괴"합니다.

것은 같은 종류의 함수의 경우에 발생합니다

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

이 같은 일을 인쇄해야합니다, 주소 차례로 취할 수 foo의 주소를 들고 어떤 변수가 없기 때문에.

+1

C++이고't'라는 변수가 있습니다. 'int (&) [10]'형의 인수를 받아들이는 함수에 건네 줄 수가 있습니다. – Abyx

+3

-1 "t 변수는 변경할 수 없기 때문에 t 변수가 없습니다." 부정확하다. 선언에서 명명 된 객체를 변수라고합니다. 표준을 찾아보십시오. –

3

t의 실제 유형은 int[10]이므로 &t은 배열의 주소입니다.
또한 int[] 내재적 그래서 t 배열 어레이의 첫 번째 요소의 해결 변환 int*로 변환한다.

+2

아니요, 첫 번째 요소의 주소로 변환됩니다. 절대 메모리 위치는 동일하지만 형식이 상당히 다릅니다. –

+0

@BenVoigt, 예, 감사합니다. – Abyx