2014-03-30 5 views
4

C의 언어 디자이너는 모두 포인터 타입왜 * 표기법을 사용하여 포인터를 정의하고 역 참조를 사용합니까?

int* x; 

을 정의하고 포인터를 역 참조의 별을 사용하는 이유가 있나요?

int y = *x; 

동일한 문맥에서 항상 동일한 문자가 사용되므로 혼란 스럽습니다.

+0

왜 [역 참조 연산자 (\ *)가 포인터를 선언하는데도 사용됩니까?] (http://stackoverflow.com/questions/8685514/why-is-the-dereference-operator-also -used-to-declare-a-pointer) – OldProgrammer

+1

어떤 대안을 제안하셨습니까? – Mehrdad

+0

이와 같은 질문을하기 전에 SO 검색을하십시오. – OldProgrammer

답변

6

Quora에 대한이 주제에 대한 우수 답변은 Brian Bi입니다. 나는 그것을 그대로 그대로 재현한다. http://www.quora.com/C-programming-language/Why-doesnt-C-use-better-notation-for-pointers

포인터를 역 참조 할 때 사용되는 포인터와 별표 (*)를 선언 할 때 별표 (*)가 사용된다는 사실은 그것은 의도적 인 C.에 유용성 결함의 일종이 아니다.

이렇게 작동하는 다른 두 가지 표기법이 있습니다. 배열을 선언 할 때는 대괄호를 사용하고 배열에 액세스 할 때는 대괄호를 사용합니다. 함수 포인터를 선언 할 때는 괄호를 사용하고 함수 포인터를 호출 할 때는 괄호를 사용합니다.

선언 다음에 사용법이 나와 있습니다.

다음 선언을 고려하십시오. int * a; 이 선언은 * a 유형이 int 인 을 알려줍니다. 즉, a는 int에 대한 포인터입니다.

어때 이것에 대해 : int * [10]; 이 선언은 * a [i] (여기서 i는 0과 9 사이에 포함됨)이 int 유형임을 나타냅니다. 배열 인덱싱이 포인터 역 참조보다 우선 순위가 높으므로 에 []을 사용할 수 있다는 것을 알려주고 (즉, 배열) 은 포인터를 사용합니다. 결과로 int를 얻는다. 즉, a는 int에 대한 포인터 배열 [10]입니다.

int (* a) [10]; 이 선언은 (* a) [i]가 int 유형임을 나타냅니다. a는 * on을 사용할 수있는 포인터이므로 포인터 여야합니다. 그리고 결과에 []를 사용하여 int를 얻을 수 있습니다. 따라서 우리는 의 타입이 int의 배열 [10]에 대한 포인터가되어야 함을 알 수 있습니다.

위의 두 선언은 괄호에서만 서로 다릅니다. 그러나 당신은 선언하고자하는 모든 유형의 괄호가 어디에 있어야하는지 기억할 필요가 없습니다. 위의 두 예제와 마찬가지로 변수를 사용하는 방법을 작성하고 을 입력하고 처음에 마지막 유형을 찰깍 소리가 나게하십시오. 선행 이유로 삽입해야하는 괄호 인 도 선언문에 포함됩니다.

많은 C 프로그래머가 함수 포인터를 선언하는 방법을 기억하는 데 어려움이 있습니다. 이것은 또한 선언이 사용을 따른 것을 기억할 때 쉽게됩니다. 예를 들어, 이 strcpy 함수의 주소를 보유하는 데 사용할 수있는 함수 포인터를 선언합시다.이 변수는 입니다. 사용하려면 먼저 으로 역 참조하고 을 호출하고()를 사용합니다. 여기서 괄호에는 두 개의 인수가 있습니다. 첫 번째는 은이고 두 번째 const는 char *입니다. 결과는 char *입니다.

함수 포인터 p를 호출 해 보겠습니다. 우리가 먼저해야 할 일은 역 참조이므로 입니다. 그래서 * p를 적어 둡니다. 그런 다음 char 및 const char * 인수를 사용하여 p를 호출하므로 * p : (p) (char, const char *) 옆의 괄호 안에 적어 둡니다. 함수 호출이 우선 참조보다 우선 순위가 높기 때문에 괄호는 p 주위에 필요합니다. 마지막으로 사용 결과 인 함수가 반환하는 결과를 앞에 둡니다. 그래서 우리의 선언은 다음과 같습니다. char * (p) (char, const char *);

const는 특별한 경우입니다. 선언문의 키워드 const는 변수에 부분적으로 만 사용하는 경우 어떤 것이 든간에 에 적용되지만 일단 얻으면 중지됩니다. 그것은 특별한 것 은 변경할 수 없다는 것을 의미합니다.

이제 const char *를 알 수있을 것입니다. 상수 문자를 가리키는 포인터를 선언합니다. 그것은 의미가 있습니다. 왜냐하면 시작 부분에있는 것은 const char입니다. 즉, * s의 결과는 const char입니다. 그러나 도 char const * s; 형식으로 쓸 수 있습니다. 해석은 까지 우리는 * s까지 "얻을"수 있고, 그 다음에 const라는 단어를 보게되므로 이 의미하는 바는 const입니다. 순간에 대한 const를 무시하고 char을 봅니다. 그래서 * s는 char이고, const는 const이라는 단어 const가 * s 앞에 있기 때문에 const입니다.

이제는 char * const s; 이것은 char에 대한 const 포인터를 의미합니다. 포인터는 변경할 수 없지만 포인터는 변경할 수 있습니다. 키워드 const가 s 바로 앞에 오기 때문에 이기 때문에 역 참조 연산자의 "거짓말은 "입니다. s는 const이다. 은 역 참조되지만 * s는 const가 아니다. 선언 char const * const s; 또는 const char * const s; const char에 대한 평균 const 포인터.

이중 (이상) 포인터의 경우 동일한 의미입니다. const char ** p; const const char **와 마찬가지로 const char에 대한 포인터에 대한 포인터를 선언합니다. 그러나 char * const * p; const 포인터에 대한 포인터를 char, 및 char ** const p에 선언합니다. char 포인터에 대한 const 포인터를 delcares합니다.

선언 다음에 사용법을 기억하십시오. 선언문 구문에 의해 다시 혼동되지 않을 것입니다. .

관련 문제