2013-08-02 3 views
0

에 대한 포인터 결과에 주소를 전달 하는가하는 &a[0]의 유형 pointer to int이거나 int인지?
내가이 글을 읽고 후이 혼란에 온 :유형 승격

은 배열의 첫 번째 요소에 대한 포인터로 a를 사용하여, 우리는 수정할 수 [0] : *a = 7;.

참고 : &a[0] 유형을 알고 싶습니다.

+4

'a [0]'은 int이므로'& a [0]'은 int를 가리키는 포인터입니다. '& (something)'은 그 것에 대한 포인터입니다. '*'접두사를 붙일 때 할당이 다르게 작동하기 때문에 포인터에 대한 할당이 혼란 스럽습니다. –

+0

아래로 유권자가 의견을 남깁니다 .. – haccks

답변

2

&a[0]int에 대한 포인터입니다. 첨자 연산자 []는 주소 연산자 &보다 더 긴밀하게 결합하기 때문에

  • &a[0]&(a[0])로 구문 분석 : 여기에 대한 해석의 단계는 다음과 같습니다.
  • a은 배열이지만이 경우 첫 번째 요소에 대한 포인터로 자동 변환됩니다. (이것은 sizeof, _Alignof 또는 &의 피연산자 있었다 또는 어레이를 초기화하는 데 사용되는 문자 스트링 인 경우는 전환되지 않을 것이다.)
  • a[0] 포인터를 취하고 상기 제 원소 (원소 0)에 대한 좌변된다.
  • &(a[0])a[0]에 대한 포인터입니다.a[0]int이며 a[0]에 대한 포인터는 int에 대한 포인터입니다.

p에는 &a[0]의 값이 할당됩니다. 따라서 pa의 첫 번째 요소에 대한 포인터입니다.

pa의 첫 번째 요소에 대한 포인터이기 때문에 *p은 해당 요소의 왼쪽 값입니다. lvalue는 과제의 왼쪽에서 참조하는 객체에 할당 할 수 있습니다.

+0

'p = a' 문에서'a'는'integer array type'이 아니며'int to pointer'로 승격됩니까? – haccks

+0

@ haccks 이것은 배열로 포인터가 쇠퇴하는 것입니다 : http://stackoverflow.com/a/1461466/1708801 –

+0

@ShafikYaghmour; 포인터'p '에 대입 될 때'a '의 타입에 대해서만 알고 싶을뿐입니다. – haccks

0

a[0]의 주소는 정수에 대한 포인터 유형입니다. *a*(a + 0)과 같으므로 a[0] 일 뿐이므로 배열의 첫 번째 요소를 수정할 수 있습니다.

1

&은 주소 연산자이므로 &a[0]은 배열 a의 첫 번째 요소 주소를 취하므로 int *입니다. []*보다 higher precedence을 가지고 있기 때문에 다음과 같이 당신은 그것을 읽을 수 있습니다 :

&(a[0]) 

더 명확 할 수있다. 이 사건 당신은 여기서

p = a ; 

작품 배열 decaying to a pointer에 않습니다. 역사적인 이유로

p = a; 

p = &a[0] 

에 대한

1

은 동일합니다. 참고

auto q = &a; 

도 유효하지만 q 유형은 int *가 아니라 int [10] *가됩니다. 이것은 아마도 당신이 원하는 것이 아닙니다.

+3

'auto q = & a'는 C가 아닙니다.이 질문에는 C가 붙지 않고 C++. –