포인터를 선언하는 가장 좋아하는 방법은 무엇입니까?
int* i;
또는
int *i;
또는
int * i;
또는
int*i;
이유를 설명하십시오.
int*i;
-공백은 나무에서 자라지 않습니다.
포인터를 선언하는 가장 좋아하는 방법은 무엇입니까?
int* i;
또는
int *i;
또는
int * i;
또는
int*i;
이유를 설명하십시오.
int*i;
-공백은 나무에서 자라지 않습니다.
답변:
당신이 쓰는 경우 :
int* i, j, k;
i, j 및 k가 모두에 대한 포인터임을 오도하게 제안합니다 int
.
따라서 변수 이름에 *를 추가하는 것이 우수하다고 주장합니다.
int * i;
한 번에 곱셈처럼 보이기 때문에 경쟁자가 아닌 것이 좋습니다 .
int*
한 유형으로 표시되며 int* i, j
두 개의 포인터를 선언합니다. 질문은 불완전한 것으로 간주 될 수 있습니다. 사용하는 언어에 따라 어떤 스타일이 합리적입니까? CI int *x
에서 C #에서는 그렇지 않습니다.
나는 "포인터에 대한 포인터"유형을 가지고 int* i
있기 때문에 이것을 선호 i
하며, 이것이 유형 시스템과 균일하게 만든다고 생각합니다. 물론 잘 알려진 동작은 한 줄에 여러 포인터를 정의하려고 할 때 (즉, 포인터를 선언하기 위해 각 변수 이름 앞에 별표를 붙여야 함), 포인터를 이런 식으로 선언하지는 않습니다. 또한 C 스타일 언어에서는 심각한 결함이라고 생각합니다.
*i
유형 이이라고 주장합니다 int
.
유형에 중점을 두지 않는 C의 경우 다음을 선호합니다.
int *i;
int
포인터가 아닌 에 대한 설명이 있기 때문 입니다. 무엇입니까 int
? *i
int입니다.
int i = 5
있는 경우 값을 얻으려면 i
name을 사용합니다 i
. 마찬가지로, int *i; *i = 5
값을 얻으려면을 사용하십시오 *i
.
나는 int* i
몇 년 동안 선호 했다. 그러나 int *i
이전 스타일을 사용할 때 여전히 여러 선언 규칙을 기억해야하므로 강력한 논거가 있습니다.
int* a, *b; // not int* a, b;
이 규칙을 기억해야하므로 간단하게 얻을 수는 없지만 더 복잡하다고는 말할 수 없습니다. 한 줄에 여러 선언을 피하는 것은이 규칙을 기억하는 또 다른 방법 일뿐입니다. 두 스타일의 차이점은 무례합니다.
그러나 그것을 사용하더라도 C 선언 구문이 구문 적으로 바인딩 된 변수가 아닌 유형 옆에 별표를 배치하여 C 선언 구문이 작동하지 않는 것처럼 약간 어리석은 느낌이 듭니다.
그 하나에 내가 구입하지 않는 강조 (대한 포인터 타입을 i
다른 (대한 INT 유형을 강조하면서) *i
),하지만 C 및 C ++ 사용 15 년 후, 그냥 것이 될 수 있다 없이, 내가 볼 때 이 질문을하는 대부분의 초보자는 아직 할 수없는 일에 대해 생각해야합니다.
또한 선호하는 경우에도 다른 스타일의 코드를 읽고 쓰는 것이 어색하지 않습니다. 일관성, bla bla blah.
언급 할 필요조차 없습니다 int * i
.
int* i
(C ++ 스타일)을 선호합니다 .
결과적인 시각적 모호성 ( int* i, j
) 으로 인해 하나의 명령문에서 여러 변수를 선언하지 않습니다 .
이론적 근거 는 Bjarne Stroustrup의 C ++ 스타일 및 기술 FAQ 를 참조하십시오 .
여러 변수를 선언하고 별표를 반복하지 않으려는 경우 :
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;
이것은 배열 및 참조와 같은 "문제 유형"과 함께 작동합니다.
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
typedef int* int_ptr
트릭을 완료했을 것입니다. 물론, 다른 포인터 유형에 대해 새로운 typedef를 선언해야하지만 실제로는 얼마나 많은 것입니까? 최대 여덟?
int* i;
첫 번째 부분은 변수 유형 (포인터에 대한 포인터)을 나타내고 두 번째 부분은 이름 ( i
)을 나타 내기 때문에 갈 것입니다 . 유형이 int
이고 이름이 *i
입니다. 또한 int * i;
나에게 곱셈처럼 보입니다.
실제로 특정 상황에서 세 가지 규칙을 모두 사용합니다. 언뜻보기에는 일관성이없는 것처럼 보이지만 ...
int *
식별자가 존재하지 않는 경우, 이름이 존재하지 않는 것을 시각적으로 강화한다.int* intptr
에서 typedef
의 유사한 선언 시각적으로 강화하는 유형의 그것의 일부가. 함수 포인터 선언과 마찬가지로 :(int* (*foo)(int))
int *identifier
그리고 class &identifier
함수 매개 변수를 사용하여 매개 변수가 잠재적으로 소위 "out"매개 변수임을 시각적으로 강화합니다.const int * const * const
cv 한정자를 사용할 때마다int * foo;
지역 선언에.나는 시각적으로 다소 지향적이라고 생각합니다.
C에는 포인터 타입이 없습니다! "int *"는 아무 의미가 없습니다. 별표는 항상 그 위에 쓰여진 요소에 묶여 있으며 그 요소에 속해 있습니다. "* i"는 정수입니다. 그리고 * i는 int이므로 i는 int에 대한 포인터입니다. 이것이 바로 그 논리이며 "int * i"가 유일한 해결책 인 이유입니다. 다른 모든 것은 환상입니다 (대부분의 경우 컴파일러가 자동으로 수정합니다). C ++과 C #에서는 다른 점이 있습니다. 그러나 C에는 "Dennis M. Ritchie : C 프로그래밍 언어"라는 성경 만 있습니다. Dennis (RIP!)는 "int * i"라고 썼습니다. 이것에 의문을 가질 필요는 없습니다.
int*
포인터 유형입니다.