C / C ++에서 포인터 변수를 선언하는 올바른 방법 [닫힘]


91

어떤 사람들은 포인터 변수를 선언하기 위해 다음 표기법을 사용하는 것을 보았습니다.

(a) char* p;

대신에

(b) char *p;

나는 (b)를 사용합니다. 표기법 (a)의 합리적 이유는 무엇입니까? 문자 포인터가 유형 자체가 아니기 때문에 표기법 (b)가 더 의미가 있습니다. 대신 유형은 문자이고 변수는 문자에 대한 포인터가 될 수 있습니다.

char* c;

이것은 char * 유형이 있고 변수 c가 해당 유형 인 것처럼 보입니다. 그러나 실제로 유형은 char이고 * c (c가 가리키는 메모리 위치)는 해당 유형 (char)입니다. 한 번에 여러 변수를 선언하면이 구분이 분명해집니다.

char* c, *d;

이상하게 보입니다. c와 d는 모두 문자를 가리키는 동일한 종류의 포인터입니다. 이 때문에 다음이 더 자연스럽게 보입니다.

char *c, *d;

감사.


7
char 포인터가 유형이 아니라는 것은 무엇을 의미합니까? 포인터가 유형이 아니라는 말입니까?
Benjamin Lindley 2011-08-09

1
특정 스타일 가이드를 보지 않는 한 선호하는 문제라고 생각합니다 (즉, 회사에 따라야하는 특정 코딩 표준이있을 수 있음). 나는 그것을 선택 b와 중간에 섞는 경향이 있습니다. 때때로 나는 char *t적절 해 보이지 않아 char * t;대신 할 수 있습니다 . 그러나 나도 자주 보았다 char* t;.
RageD 2011-08-09

1
또한 "유형이 char이고 * c (c가 가리키는 메모리 위치)가 해당 유형 (char)입니다"라는 추론 은 실제로 선언되지 않은 char가 선언되어 있음을 나타내는 것처럼 보입니다. 초심자에 의해 처리되는 경우, 메모리 액세스 위반으로 이어질 것입니다.
Benjamin Lindley

1
둘 다 여전히 충분히 설명 적입니다. (b) * p가 유형 char이고 (a) p가 a임을 보여줍니다pointer to a char
A Person

1
10 년이 넘는 업계 경험을 바탕으로 오늘이 처음으로 다른 업계 전문가의 기사를 읽었습니다. 분명히, 나는 탭 v 스페이스, def 또는 dec의 코멘트 또는 다른 "논쟁 할 더 중요한 것이없는 것이 좋다"토픽에 대해했던 것처럼 이것들에 대해 종교적인 대화를 한 적이 없습니다. . 그것이 내 관점이기 때문에, 나는 내 경력의 게임에서 너무 늦게 "char * p"를 자주 사용하는 것을 선호했습니다. 예, 이전 공간, 이후 공간. 내가 찾은 대부분의 경우 포인터를 더 분명하게 만들기 때문에 버그를 줄입니다.
KIT10

답변:


102

Bjarne Stroustrup 님의 메시지 :

"int * p;"중에서 선택 및 "int * p;" 옳고 그름이 아니라 스타일과 강조에 관한 것입니다. C 강조 표현; 선언은 종종 필요한 악에 불과한 것으로 간주되었습니다. 반면에 C ++는 유형에 중점을 둡니다.

"전형적인 C 프로그래머"는 "int * p;"라고 씁니다. 구문을 강조하는 "* p는 int입니다"라고 설명하고 스타일의 정확성을 주장하기 위해 C (및 C ++) 선언 문법을 가리킬 수 있습니다. 실제로 *는 문법에서 p라는 이름에 바인딩됩니다.

"일반적인 C ++ 프로그래머"는 "int * p;"라고 씁니다. "p는 int에 대한 포인터"라는 유형을 강조하여 설명합니다. 실제로 p의 유형은 int *입니다. 나는 분명히 그 강조를 선호하며 C ++의 고급 부분을 잘 사용하는 데 중요하다고 생각합니다.

출처 : http://www.stroustrup.com/bs_faq2.html#whitespace

한 줄에 여러 포인터를 선언하는 상황 (4 번째 예)에서는 변수와 함께 별표를 사용하는 것이 익숙하기 때문에 후자의 스타일을 권장합니다.


34
다른 사람들은 동일한 선언에서 여러 객체를 선언하지 않는 것이 좋습니다. :-)
Bo Persson 2011 년

5
구문 뒤에있는 논리를 강조하므로 선호합니다 : int *p, 의미 : p역 참조되면 int. 그런 다음로 구분 된 여러 선언 ,이 의미가 있습니다. int *p, *q, r( p또는 q역 참조 int될 때, r참조 될 때 를 얻습니다 int). 또한, 함수 포인터 구문 의미가 있습니다 : int (*f)()(때 f역 참조와 호출 내가 얻을 int). 그리고 이것은 의미가 있습니다 : int *p, (*f)().
Druesukker

2
이것은 논쟁의 다른 측면에 타당성이 있다는 것을 깨닫는 데 도움이되었습니다. 대부분 고수준 프로그래머이기 때문에 저는 유형을 강조합니다. 그리고 선호합니다 int*. 나에게는 int *p, (*f)()그다지 말이되지 않지만 어떤 상황에서 어떤 사람들에게는 그것이 어떻게 될지 알 수 있습니다.
Assimilater 2015 년

1
@Druesukker, 귀하의 진술은 위의 어느 것보다 더 의미가 있다고 생각합니다.
Muntashir Akon 2017

1
@Druesukker 그러나 논리는 정확히 작동하지 않습니다 void*(그리고 C ++ 참조에서는 전혀 작동하지 않습니다).
jamesdlin

57

나는 개인적으로 *나머지 유형과 함께 배치하는 것을 선호 합니다

char* p;  // p is a pointer to a char.

사람들은 "그러면 char* p, q;오해의 소지가있다"고 주장 할 것입니다 . "그러니 그렇게하지 마십시오".


char * p에 대한 아주 좋은 주장; 선택 :) 어떤 경우에 그들이 그렇게해서는 안되는 예를 보여 주었 듯이 읽기가 어려워지지 않는 한 나는 그들 중 어느 것도 신경 쓰지 않습니다.
예수 라모스

1
그리고 언제 값을 출력하고 싶습니까? 당신은 cout << *p;합니다. 그렇다면 선언하는 동안 별을 앞에 두지 않는 이유는 무엇입니까? 제 생각에는 덜 혼란 스러울 것입니다. p*p
user1170330

13
@ user1170330, 한 번에 유형 정의의 일부이고 다른 부분에서는 역 참조 연산자이기 때문입니다. 관계가 없습니다. 어떤 것이 든 다르게 보이는 것이 좋은 것입니다. 다른 것들이 다르게 보일 것이기 때문입니다.
ikegami

33

쓰는 방법에는 차이가 없습니다. 그러나 한 줄에 두 개 이상의 포인터를 선언하려면 (b) 변형을 사용하는 것이 좋습니다. 원하는 것이 분명하기 때문입니다. 아래를보세요 :

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.

5
typedef"물론"더 나은 방법은 아닙니다. 어떤 사람들은 그것을 선호 할 수도 있지만 여러 사람이 코드를 작업하는 경우 문제가됩니다. 내가 익숙하지 않다면 나는 내가 의도 한 것이 아니라 a 인 PCHAR것과 같은 것을 쓸 PCHAR *p;수있다 char**. 일반적으로를 원하면 새로운 유형 char**을 작성 PCHAR*하거나 정의 해야합니다 .
BlackJack

3
함수에 대한 포인터와 같은 복잡한 포인터 유형이 필요한 경우 typedef를 만드는 것이 좋습니다. 이 경우 코드를 훨씬 더 간단하게 만듭니다. 반면에 PCHAR을 사용하는 것은 일상적인 연습보다 더 종합적인 예입니다. 그러나 그것은 당신이 원하는 것을 분명히 만듭니다. 그리고 그냥 멍청 해지기 시작합니다. 모든 불만은 Stroustrup으로 보내주세요 :-)
George Gaál 2011-08-09

char에 대한 포인터를 정의하기 위해 PCHAR * p를 작성했다면 당신이 무엇을하는지 모르고 def 유형을 읽지 않은 것이 분명합니다. 대답은 그의 의견입니다. typedef에는 또 다른 이점이 있습니다. C에서는 불투명하게 만드는 쉬운 방법에 있습니다. 공개적으로 심볼을 VOID ptr로 정의하고, 개인적으로 type def는 다른 것입니다. C ++ 11은 자동차로 그 대부분을 해결합니다
UpAndAdam

대학을 졸업 한 지 5 년이 지난 지금 C ++로 다시 돌아 오려는 사람에게는 이것이 최고의 답 중 하나입니다.
Panzercrisis

10

타협은

char * p;

K & R 사용

char *p;

코딩 표준을 따르지 않는 한 그것은 당신에게 달려 있습니다.이 경우 다른 사람들이하는 일을 따라야합니다.


4
나는 char * x, y가 y가 char *라는 것을 의미하지 않는다는 어려운 방법을 배웠습니다. 이제 K & R이 말한 스타일을 따르는 이유를 알 수 있습니다.
Rahul Kadukar 2015

K & R이란 무엇이며 단일 코드 소스가 사용하는 것이 중요한 이유는 무엇입니까? 나는 char* p;. 그것은 관습이나 규칙이 아니라 스타일의 문제입니다. 나에게 p가 유형이라는 것이 더 의미가 char*있으므로 분명히 *는 유형과 함께 있어야합니다.
FalcoGer

@FalcoGer K & R 링크를 추가했습니다. 단일 코드 소스가 무엇을 사용하는지는 중요하지 않습니다. 코드를 이해하기 위해 더 열심히 일하게하여 표준을 따르지 않으면 팀이 짜증을 낼 수 있습니다. 요즘은 clang-format어쨌든 팀이 사용하기를 바랍니다 .
jnnnnn

2

개인적으로 프로젝트에서 char *를 보는 것은 모두 선호도의 문제입니다. 별도의 줄에 여러 포인터를 선언하는 경향이 있습니다. 이를 수행하는 실제 "올바른"방법은 없으며 모든 것이 선호도에 달려 있습니다. 어떤 사람들은 (a) 읽기가 더 쉽다고 말하고 다른 사람들은 (b) 같은 줄에 같은 유형의 더 많은 변수를 선언하는 것이 더 쉽다고 말합니다.

나는 (b)가 더 일반적이라고 생각하고 어떤 경우에는

char * a;

또는 이와 비슷한 것. 다시 선호합니다. 당신이 편한 것이 무엇이든, 내가 작업중인 프로젝트가 무엇을 사용하든 나는 사용할 것이다 (내가 (a)를 사용하는 경우에 내가 직접 작성하지 않는 한)

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