2014-04-05 2 views
1

이 내가 실행 해요 무엇 :vs after before asterisks?

pam_get_item(pamh, PAM_USER,(const void**)&pam_user); 

pamh는이 질문에 대한 구조체 중요하지 않습니다 및 pamuser은 무효 포인터입니다. 이 코드는 성공적으로 컴파일되고 실행됩니다. 그러나 다음과 같지 않습니다.

pam_get_item(pamh, PAM_USER,(const **void)&pam_user); 

왜 별표는 대요 이전의 의미를 변경합니까? 감사!

+4

그들은 의미를 바꾸지 않으며, 의미를 잃어 버리며, 즉 무효가됩니다. 프로그래밍 언어 구문은 이와 같습니다. 임의로 변경, 쓰레기 배출 (주로). –

+2

그것은 단지 불법 구문입니다. 문법이 불법이 된 이유는 논쟁하기가 어렵습니다. 그것이 바로 그 것이다. –

+1

마찬가지로, 범퍼 앞에서 엔진을 움직일 때 자동차가 동작을 변경하고, 신장을 두개 내 공동으로 옮길 때 몸이 행동을 바꿉니다. 일하는 것의 일부만을 가져 가서 다른 곳에 넣어 놓고 계속 작동시킬 수는 없습니다. – user2357112

답변

2

별표는 유형의 이름을 구성하는 구성 요소입니다. 그리고 형식의 이름의 구성 요소 순서는 실제로 어떤 유형인지에 영향을줍니다.

특히 별표는 형식이 왼쪽에 명명 된 형식의 포인터가되도록 형식을 수정합니다. 따라서,

void* 

void (즉, 모든 유형의 메모리 영역에 대한 포인터)에 대한 포인터입니다.

const void* 

는 그게 (는 어느 CONST, 또는이 포인터의 관점에서 CONST 간주되어야 메모리 영역 즉 포인터)를 const void 포인터이다.

const void** 

그리고 이것은 const void*에 대한 포인터입니다. 염두에 너무

, 무슨 일이 될 기대 :

const **void 

을 가리키는 const 포인터에 대한 포인터에 대한 무효? 무의미한.

+0

좋아, 왜냐하면 나는 'int * i'와'int * i'와 같은 것을 알고 있기 때문이다. 비용은 유형이 아닌 수정 자입니다. 설명 주셔서 감사합니다! – Goodies

+2

@ Goodies 그것들은 실제로 같은 것입니다. 공백은 거기에서 무관하다. – computerfreaker

2

도형 교환 연산자는 (type)입니다. 여기서 type은 유효한 유형입니다. type의 구문이 적합한 지 확인하려면 type 유형의 변수를 정의 해보십시오.

(const void**)&pam_user // ok 
const void **x; // legal, meaningful 

(const **void)&pam_user // wrong 
const **void x; // wrong, meaningless 

const는 유형 void 여기에 우수한 성능을 제공 할 수있다. 따라서 const 다음에 오는 것은 유효한 유형이어야합니다. ** void은 유효한 유형이 아닙니다. const 이후 **은 의미가 없습니다.

관련 문제