답변
작성하는 경우 :
int* i, j, k;
i, j 및 k가 모두 int
에 대한 포인터라고 오해의 소지가 있습니다.
그래서 나는 *를 변수에 추가하는 것이 더 우수하다고 주장합니다. 이름.
댓글
답변
i
에는 “int에 대한 포인터”유형이 있기 때문에이 유형이 유형 시스템과 동일하다고 생각합니다. 물론, 잘 알려진 동작은 한 줄에 여러 포인터를 정의하려고 할 때 나타납니다 (즉, 포인터를 선언하기 위해 각 변수 이름 앞에 별표를 넣어야 함). 그러나 나는 단순히 포인터를 이런 방식으로 선언하지 않습니다. 또한 “C 스타일 언어의 심각한 결함이라고 생각합니다.
댓글
답변
유형에 중점을 두지 않는 C의 경우 다음을 선호합니다.
int *i;
포인터가 아닌 int
에 강조 표시가 있기 때문입니다. int
? *i
가 정수입니다.
댓글
Answer
나는 수년간 int* i
를 선호했습니다. 그러나 int *i
에 대한 강력한 주장이 있습니다. 이전 스타일을 사용할 때 여전히 다중 선언 규칙을 기억해야하기 때문입니다.
int* a, *b; // not int* a, b;
이 규칙을 기억해야하므로 단순하게 얻을 수는 없지만 더 복잡하다고는 말할 수 없습니다. 한 줄에 여러 선언을 피하는 것은이 규칙을 기억한다고 말하는 또 다른 방법입니다. . 두 스타일의 차이점은 의문의 여지가 있습니다.
하지만 제가 사용하더라도 C 선언 구문이 작동하지 않는 것처럼 가장하는 것은 유형 옆에 별표를 두는 것으로 약간 어리석은 느낌이 듭니다. 구문 적으로 결합 된 변수보다.
나는 포인터 유형을 강조 하지 않습니다 (i
) 다른 하나는 int 유형 (*i
의 경우)을 강조하지만 15 년 동안 C 및 C ++를 사용한 후에는 은 생각할 필요없이 볼 때입니다 — 일부 이 질문을하는 대부분의 초보자는 “아직 할 수 없습니다.
또한 내 취향에 따라 다른 스타일의 코드를 읽고 쓰는 것이 어색하지 않습니다. 일관성, bla bla blah.
int * i
를 언급 할 필요도 없습니다.
답변
첫 번째를 선호합니다. 포인터가되는 것이 유형의 일부이기 때문에 당연합니다.
C #을 사용하기 때문에 C보다 더 직관적 인 방식으로 유형을 처리하므로 동일한 명령문에서 여러 포인터를 선언하는 데 문제가 없습니다.
int* a, b, c; // three pointers
답변
답변
여러 변수를 선언하고 싶지만 별표를 반복하지 않으려는 경우 :
template <typename T> struct pointer_to { typedef T* type; }; pointer_to<int>::type p1, p2, p3;
(구조 템플릿 내부에서 볼 수 있듯이 저는 int* i
스타일을 선호합니다.)
다음은보다 일반적인 솔루션입니다.
template <typename T> struct identity { typedef T type; }; identity<int*>::type p1, p2, p3;
이것은 배열 및 참조와 같은 모든 “문제 유형”에서 작동합니다.
댓글
답변
int* i;
첫 번째 부분은 변수 유형 (int에 대한 포인터)을 나타내며 두 번째 부분은 이름 (i
)을 나타 내기 때문입니다. 유형은 int
이고 이름은 *i
입니다. 또한 int * i;
는 곱셈과 비슷해 보입니다.
댓글
답변
선언에서 int * i;
를 사용합니다. i is a pointer to an integer
.
포인터는 유형과 변수 모두에 기여하므로 중간에 있어야합니다.
같은 줄에 여러 항목을 선언하지 않는 것이 좋습니다. int * i, j;
답변
C에는 포인터 유형이 없습니다. 따라서 “int * “는 아무것도 의미하지 않습니다. 별표는 항상 오른쪽으로 쓰여진 요소에 묶여 있고, 오른쪽 요소에 속합니다.”* i “는 정수입니다. * i는 정수이므로 i는 다음과 같습니다. int에 대한 포인터. 이것이 그 뒤에있는 논리이고 이것이 “int * i”가 유일한 해결책 인 이유입니다. 다른 모든 것은 착각입니다 (대부분의 경우 컴파일러에 의해 자동으로 수정 됨). C ++와 C #에서 그것은 다른 것입니다. 그러나 C에는 단 하나의 성경이 있습니다 : “Dennis M. Ritchie : The C Programming Language”. Dennis (RIP!)가 쓴 : “int * i”. 이것에 대해 질문하십시오.
댓글
답변
실제로 특정 상황에서 세 가지 규칙을 모두 사용합니다. 언뜻보기에는 일관성이 없어 보이지만 …
-
int *
식별자가없는 경우 이름이 존재하지 않음을 시각적으로 강조합니다.
-
int* intptr
typedef
및 이와 유사한 선언을 통해 유형의 일부임을 시각적으로 강조합니다. 마찬가지로 함수 포인터 선언 : (int* (*foo)(int))
-
int *identifier
및 class &identifier
함수 매개 변수를 사용하여 매개 변수가 잠재적으로 “out”매개 변수라는 것을 시각적으로 강조합니다.
-
const int * const * const
cv 를 사용할 때마다 한정자.
-
int * foo;
지역 선언.
나는 다소 시각적으로 지향적 인 것 같습니다.
답변
int *i
를 사용합니다. 그래도 포인터라는 것을 알기 쉽기 때문입니다. 정말 중요하지 않다고 생각합니다.