C 포인터에 대한 많은 혼동은 원래 코딩 스타일과 관련하여 만들어진 매우 나쁜 선택에서 비롯되며 언어 구문에서 매우 나쁜 선택으로 입증되었습니다.
int *x = NULL;
C는 맞지만, 그것은 매우 오해의 소지가 있고, 심지어 무의미하다고 말할 수도 있고, 많은 초심자에게 언어 이해를 방해했습니다. 그것은 *x = NULL;
당연히 불가능한 일을 나중에 우리가 할 수 있다고 생각하게 만듭니다 . 당신은 변수의 유형이 아닌, 참조 int
, 변수의 이름은하지 *x
않으며, 수행 *
선언에가와 공동으로 기능적 역할을한다 =
. 순전히 선언적입니다. 따라서 훨씬 더 의미있는 것은 다음과 같습니다.
int* x = NULL;
원래 K & R 코딩 스타일을 고수하지는 않지만 올바른 C입니다. 유형이 int*
이고 포인터 변수 가라는 것을 완벽하게 명확하게 x
하므로 값 NULL
이에 x
대한 포인터 인 에 저장되고 있음을 시작하지 않은 사람에게도 분명하게 알 수 int
있습니다.
또한 규칙을 쉽게 유도 할 수 있습니다. 별이 변수 이름에서 멀어지면 선언이되고 이름에 붙은 별은 포인터 역 참조입니다.
그래서, 지금은 더 우리가 중 할 수있는 다운 것을 더 많이 이해하게 x = NULL;
또는 *x = 2;
그것을 쉽게 초보자 방법을 참조 할 수있게 즉 variable = expression
에 리드를 pointer-type variable = pointer-expression
하고 dereferenced-pointer-variable = expression
. (시작된 경우 '표현식'은 'rvalue'를 의미합니다.)
언어 구문에서 불행한 선택은 지역 변수를 선언 할 때 int i, *p;
정수와 정수에 대한 포인터를 선언하는 것을 말할 수 있으므로 *
이름의 유용한 부분 이라고 믿을 수 있다는 것 입니다. 그러나 그렇지 않습니다.이 구문은 편의를 위해 추가 된 기발한 특수 사례 일뿐입니다. 제 생각에는 위에서 제안한 규칙을 무효화하기 때문에 존재하지 않았어야했습니다. 내가 아는 한, 언어의 다른 곳에서는이 구문이 의미가 없지만 그렇다고하더라도 C에서 포인터 유형이 정의되는 방식에 차이가 있음을 나타냅니다. 다른 모든 곳, 단일 변수 선언, 매개 변수 목록, 구조체 멤버 등에서 type* pointer-variable
대신 포인터를 선언 할 수 있습니다 type *pointer-variable
. 그것은 완벽하게 합법적이고 더 합리적입니다.
int *x = whatever;
수행하고 무엇을int *x; *x = whatever;
하지가.int *x = whatever;
실제로int *x; x = whatever;
, 아닌*x = whatever;
.