2016-09-24 5 views
2

다음 발췌 내용은 Harbinson, Steele C: A Reference Manual (5th Edition)입니다. 이 책에 따르면 p에 대한 두 지정은 동일합니다. &aint의 어레이 형 포인터 반면포인터에 * 및 배열 할당

7.5.6 주소 조작

int a[10], *p; 
p = a; p = *&a; 

아직 C의 질문 Question 6.12a에 따른 int을 입력 포인터이다.

두 번째 할당 p = *&a에 유형 오류가 발생하므로 포인터에 int 배열을 지정하려고합니다.

p = *&a 지정이 올바른 이유는 무엇입니까?

+2

만약 '& a'가'int'의 배열을 가리키는 포인터라면, * & a는'int'의 배열입니다.이 배열은'int'에 대한 포인터 형입니다. 'p'. –

+1

질문 본문에 _post links_를 추가하지 마십시오.어쨌든 모든 좋은 대답은 인용/인용 할 것입니다. –

+1

단항'*'은 단항'&'의 반대이므로'* & a == a'이므로'p = a'가 합법적 인 경우'p = * & a'도 마찬가지입니다. – jamesdlin

답변

3

* 단항 연산자를 나타내고 간접

C11 챕터 §6.5.3.2, 주소 및 간접 연산자을 인용. [...] 피연산자의 타입이 이고 포인터가 ''이면 결과는 타입 이고 타입은입니다. [...]

그래서

  • &a, p = *&a; 대한 포인터 "int의 배열"이다.
  • *&a은 배열 유형입니다.

이제 할당의 RHS에서 사용될 때 배열 유형은 배열의 첫 번째 요소 인 int *을 가리키는 포인터로 감쇠됩니다. 이 sizeof의 연산자의 피연산자는 _Alignof 운영자 또는 단항 & 운영자, 또는 어레이를 초기화하는 데 사용되는 문자 스트링 인 경우를 제외

인용 C11 장 §6.3.2.1

유형 의 ''배열 유형 ''의 표현식은 ''유형의 포인터 '' 인 을 가리키는 표현식으로 변환되며 lvalue가 아닙니다. [...]

따라서 경고/오류는보고되지 않았습니다.

+1

@Roland 음, 공식 문서는 무료로 제공되지 않습니다. _ 힌트 : n1570으로 구글 검색을 해주세요. 도와주세요. :) –

1

*&이 함께 나오면 평가되지 않습니다. p = *&a;p = a;과 동등합니다. *&은 서로의 효과를 무효화합니다.

+0

선생님,'& *'이 (가) 일어나는 것을 알고 있습니다.'* &'도 마찬가지입니까? §6.5.3.2/p3 –

+0

@SouravGhosh; 예, 최종 결과는 동일합니다. – haccks

관련 문제