int * i; 또는 int * i; 또는 int * i; [닫은]


30

포인터를 선언하는 가장 좋아하는 방법은 무엇입니까?

int* i;

또는

int *i;

또는

int * i;

또는

int*i;

이유를 설명하십시오.

참조 : http://www.stroustrup.com/bs_faq2.html#whitespace


19
나는 다른 3000 라인에 집중하고

29
int*i;-공백은 나무에서 자라지 않습니다.
Shog9

이것은 본질적으로 같은 질문입니다. 여기 내 대답이 있습니다.
Keith Thompson

답변:


75

당신이 쓰는 경우 :

int* i, j, k;

i, j 및 k가 모두에 대한 포인터임을 오도하게 제안합니다 int.

따라서 변수 이름에 *를 추가하는 것이 우수하다고 주장합니다.


35
그리고 나는 int * i;한 번에 곱셈처럼 보이기 때문에 경쟁자가 아닌 것이 좋습니다 .
John K

1
이전에이 시나리오를 고려하지 않았기 때문에 +1입니다.
Pops

4
"i, j 및 k가 모두 int에 대한 포인터임을 오도하게 제안합니다." C #을 작성하지 않는 int*한 유형으로 표시되며 int* i, j두 개의 포인터를 선언합니다. 질문은 불완전한 것으로 간주 될 수 있습니다. 사용하는 언어에 따라 어떤 스타일이 합리적입니까? CI int *x에서 C #에서는 그렇지 않습니다.
Joren

1
@Joren : 죄송합니다. C # 프로그래머가 아니기 때문에 질문의 코드 조각을 보면서 간단히 C 또는 C ++이라고 가정했습니다.
랜달 슐츠

C #이 구체적으로 언급되지 않은 한 C 또는 C ++이라고 가정하는 것이 합리적이라고 생각합니다. C #에서 포인터를 자주 보지 못합니다.
대안

62

나는 "포인터에 대한 포인터"유형을 가지고 int* i있기 때문에 이것을 선호 i하며, 이것이 유형 시스템과 균일하게 만든다고 생각합니다. 물론 잘 알려진 동작은 한 줄에 여러 포인터를 정의하려고 할 때 (즉, 포인터를 선언하기 위해 각 변수 이름 앞에 별표를 붙여야 함), 포인터를 이런 식으로 선언하지는 않습니다. 또한 C 스타일 언어에서는 심각한 결함이라고 생각합니다.


8
나도이 협약을 따릅니다. 같은 이유로.
gablin

5
개인적으로 코드에서 여러 포인터를 선언하면 코드 냄새로 취급합니다. 많은 포인터가 필요하지 않습니다. 보통은 그렇지 않습니다. 따라서 한 줄에 여러 선언이있는 문제는 내가 작성한 모든 코드에서 발생하지 않습니다.
greyfade

5
이것의 문제점은 타입이 "int에 대한 포인터"가 아니라는 것입니다. C (및 C ++)에는 포인터 유형이 없습니다. int 유형의 메모리 블록에 대한 포인터입니다.
빌리 ONeal

10
나는 *i유형 이이라고 주장합니다 int.
Tim Goodman

5
@ 빌리 : 그렇다면 12 년 동안 표준을 이해하고 파싱하고 설명하려는 혼란을 본 적이 없습니다. "int에 대한 포인터"는 C 및 C ++에서 완벽하게 유효한 유형입니다.

23

유형에 중점을 두지 않는 C의 경우 다음을 선호합니다.

int *i;

int포인터가 아닌 에 대한 설명이 있기 때문 입니다. 무엇입니까 int? *iint입니다.


2
좋은 지적. 포인터를 사용하면 시작을 이름의 일부로 생각할 수 있습니다. 예를 들어,을 가지고 int i = 5있는 경우 값을 얻으려면 iname을 사용합니다 i. 마찬가지로, int *i; *i = 5값을 얻으려면을 사용하십시오 *i.
mipadi

나는 int * i를 다음과 같이 읽습니다. * i는 int입니다. 따라서 나는 int에 대한 포인터입니다. C에서 변수 선언은 유형 표현식 int 및 *를 사용하는 연산자 일뿐입니다. int * i는 int (* (i))로 구문 분석되며 정수에 대한 포인터 유형을 갖는 것으로 해석됩니다. char * p []는 char (* ([] (p)))로 해석되고 ([]가 *보다 우선 순위가 높기 때문에) p는 char에 대한 포인터의 배열을가집니다.
Giorgio

이런 이유로 나는 변수 옆에 *를 쓰기로 결정했다고 생각합니다. *는 변수에 적용되는 연산자이기 때문입니다.
Giorgio

7

나는 int* i몇 년 동안 선호 했다. 그러나 int *i이전 스타일을 사용할 때 여전히 여러 선언 규칙을 기억해야하므로 강력한 논거가 있습니다.

int* a, *b; // not int* a, b;

이 규칙을 기억해야하므로 간단하게 얻을 수는 없지만 더 복잡하다고는 말할 수 없습니다. 한 줄에 여러 선언을 피하는 것은이 규칙을 기억하는 또 다른 방법 일뿐입니다. 두 스타일의 차이점은 무례합니다.

그러나 그것을 사용하더라도 C 선언 구문이 구문 적으로 바인딩 된 변수가 아닌 유형 옆에 별표를 배치하여 C 선언 구문이 작동하지 않는 것처럼 약간 어리석은 느낌이 듭니다.

그 하나에 내가 구입하지 않는 강조 (대한 포인터 타입을 i다른 (대한 INT 유형을 강조하면서) *i),하지만 C 및 C ++ 사용 15 년 후, 그냥 것이 될 수 있다 없이, 내가 볼 때 이 질문을하는 대부분의 초보자는 아직 할 수없는 일에 대해 생각해야합니다.

또한 선호하는 경우에도 다른 스타일의 코드를 읽고 쓰는 것이 어색하지 않습니다. 일관성, bla bla blah.

언급 할 필요조차 없습니다 int * i.


6

나는 첫 번째를 선호합니다. 포인터가 유형의 일부이므로 자연 스럽습니다.

C #을 사용함에 따라 C보다 직관적 인 방식으로 유형을 처리하므로 동일한 명령문에서 여러 포인터를 선언하는 데 아무런 문제가 없습니다.

int* a, b, c; // three pointers


4

여러 변수를 선언하고 별표를 반복하지 않으려는 경우 :

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);

omg, c ++는 항상 나에게 새로운 것을 보여줍니다 :). 감사!
Tamás Szelei

1
세상에, C ++는 끔찍하다! typedef int* int_ptr트릭을 완료했을 것입니다. 물론, 다른 포인터 유형에 대해 새로운 typedef를 선언해야하지만 실제로는 얼마나 많은 것입니까? 최대 여덟?
benzado

1
@benzado 실제로, 당신은 한 줄에 여러 변수를 선언하는 제정신이 없기 때문에 typedef 또는 내가 보여준 멋진 트릭이 필요하지 않습니다. 그래도 여전히 흥미 롭습니다.
fredoverflow

2
나는 C ++ 프로그램이 언어 기능을 사용할 수 있기 때문에 사용하는 경향에 대해 더 많이 말하고 있었다.
benzado

@ 벤 자도 : !!! 나는 이것을 너무 자주 보았다!
Giorgio

2

int* i;첫 번째 부분은 변수 유형 (포인터에 대한 포인터)을 나타내고 두 번째 부분은 이름 ( i)을 나타 내기 때문에 갈 것입니다 . 유형이 int이고 이름이 *i입니다. 또한 int * i;나에게 곱셈처럼 보입니다.


타입 정보가 식별자 다음에 쉽게 올 수 있기 때문에 C 선언 구문은 일관성이 없습니다. 배열이 가장 명확한 예입니다.

@Roger : 알고 있지만이 질문은 단일 변수 선언에 관한 것이 었습니다.
Allon Guralnek

나는 그것이 그것에 대해 많이 읽고 있다고 생각합니다. :) 내가 질문을 이해하는 방식은 어디에서 어떤 스타일을 사용하는지 묻는 것입니다.

@Roger : 당신은 아마 맞지만, 나의 목표는 OP의 질문에 대답하는 것이 었습니다 : "포인터를 선언하는 가장 좋아하는 방법은 무엇입니까?" 분명히 모든 사람은 질문에 제시된 문제를 보더로 자유롭게 볼 수 있으며 여기에서도 권장됩니다. C / C ++에서 개발하지 않은 사람은 그렇게함으로써 내 전문 분야에서 너무 멀어 질 것이라고 생각했습니다.
Allon Guralnek

2

내가 사용하는 선언 int * i;에서 당신은 그것을 다음과 같이 읽습니다 i is a pointer to an integer.

포인터는 유형과 변수 모두에 기여하므로 중간에 있어야합니다.

같은 줄에 여러 가지를 선언하지 않는 것이 좋습니다. int * i, j;


1

실제로 특정 상황에서 세 가지 규칙을 모두 사용합니다. 언뜻보기에는 일관성이없는 것처럼 보이지만 ...

  • int * 식별자가 존재하지 않는 경우, 이름이 존재하지 않는 것을 시각적으로 강화한다.
  • int* intptr에서 typedef의 유사한 선언 시각적으로 강화하는 유형의 그것의 일부가. 함수 포인터 선언과 마찬가지로 :(int* (*foo)(int))
  • int *identifier그리고 class &identifier함수 매개 변수를 사용하여 매개 변수가 잠재적으로 소위 "out"매개 변수임을 시각적으로 강화합니다.
  • const int * const * constcv 한정자를 사용할 때마다
  • int * foo; 지역 선언에.

나는 시각적으로 다소 지향적이라고 생각합니다.


1

C에는 포인터 타입이 없습니다! "int *"는 아무 의미가 없습니다. 별표는 항상 그 위에 쓰여진 요소에 묶여 있으며 그 요소에 속해 있습니다. "* i"는 정수입니다. 그리고 * i는 int이므로 i는 int에 대한 포인터입니다. 이것이 바로 그 논리이며 "int * i"가 유일한 해결책 인 이유입니다. 다른 모든 것은 환상입니다 (대부분의 경우 컴파일러가 자동으로 수정합니다). C ++과 C #에서는 다른 점이 있습니다. 그러나 C에는 "Dennis M. Ritchie : C 프로그래밍 언어"라는 성경 만 있습니다. Dennis (RIP!)는 "int * i"라고 썼습니다. 이것에 의문을 가질 필요는 없습니다.


6
"C에는 포인터 유형이 없습니다" -그 아이디어를 어디서 얻었습니까? int*포인터 유형입니다.
Keith Thompson

-2

int *i포인터라고 생각하기 쉽기 때문에 사용 하지만 실제로는 중요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.