나는 최근에 마침내 C / C ++를 배워야한다고 결정했고, 포인터에 대해 정말로 이해하지 못하는 것이 한 가지 있습니다. 더 정확하게는 그 정의입니다.
이 예는 어떻습니까?
int* test;
int *test;
int * test;
int* test,test2;
int *test,test2;
int * test,test2;
이제 내 이해에 따르면 처음 세 가지 경우는 모두 동일합니다. Test는 int가 아니라 1에 대한 포인터입니다.
두 번째 예제 세트는 좀 더 까다 롭습니다. 경우 4에서 test와 test2는 모두 int에 대한 포인터가되고, 경우 5에서는 test 만 포인터이고 test2는 “실제”int입니다. 사례 6은 어떻습니까? 사례 5와 같습니까?
답변
4, 5, 6은 동일하며 테스트 만 포인터입니다. 두 개의 포인터를 원하면 다음을 사용해야합니다.
int *test, *test2;
또는 더 나은 (모든 것을 명확하게하기 위해) :
int* test;
int* test2;
답변
별표 주위의 공백은 의미가 없습니다. 세 가지 모두 같은 의미입니다.
int* test;
int *test;
int * test;
” int *var1, var2
“는 사람들을 혼란스럽게하기위한 사악한 구문이므로 피해야합니다. 다음으로 확장됩니다.
int *var1;
int var2;
답변
많은 코딩 지침 은 한 줄에 하나의 변수 만 선언하도록 권장합니다 . 이렇게하면이 질문을하기 전에 가졌던 종류의 혼동을 피할 수 있습니다. 내가 함께 일한 대부분의 C ++ 프로그래머는 이것에 집착하는 것 같습니다.
내가 아는 약간의 제쳐두고 유용한 것은 선언을 거꾸로 읽는 것입니다.
int* test; // test is a pointer to an int
이것은 매우 잘 작동하기 시작합니다. 특히 여러분이 const 포인터를 선언하기 시작할 때 그것이 const 인 포인터인지 아니면 포인터가 가리키는 것이 const인지를 아는 것이 까다로워집니다.
int* const test; // test is a const pointer to an int
int const * test; // test is a pointer to a const int ... but many people write this as
const int * test; // test is a pointer to an int that's const
답변
“Clockwise Spiral Rule” 을 사용하면 C / C ++ 선언을 구문 분석하는 데 도움이됩니다.
따라야 할 간단한 세 단계가 있습니다.
알 수없는 요소부터 시작하여 나선 / 시계 방향으로 이동합니다. 다음 요소가 발견되면 해당 영어 문으로 대체하십시오.
[X]
또는[]
: 배열 X 크기 … 또는 배열 정의되지 않은 크기 …
(type1, type2)
: 함수 전달 type1 및 type2 반환 …
*
: 포인터 …- 모든 토큰이 덮일 때까지 나선형 / 시계 방향으로 계속하십시오.
- 항상 괄호 안의 모든 것을 먼저 해결하십시오!
또한 선언은 가능한 경우 별도의 문으로 작성해야합니다 (대부분의 경우 사실임).
답변
다른 사람들이 언급했듯이 4, 5 및 6은 동일합니다. 종종 사람들은이 예제를 사용 *
하여 유형이 아닌 변수에 속하는 인수를 만듭니다 . 스타일의 문제이긴하지만 이렇게 생각하고 작성해야하는지에 대한 논쟁이 있습니다.
int* x; // "x is a pointer to int"
또는 이렇게 :
int *x; // "*x is an int"
FWIW 나는 첫 번째 캠프에 있지만 다른 사람들이 두 번째 형식에 대해 주장하는 이유는 (대부분)이 특정 문제를 해결하기 때문입니다.
int* x,y; // "x is a pointer to int, y is an int"
잠재적으로 오해의 소지가 있습니다. 대신 당신은
int *x,y; // it's a little clearer what is going on here
또는 정말로 두 개의 포인터를 원한다면
int *x, *y; // two pointers
개인적으로 한 줄에 하나의 변수로 유지하면 어떤 스타일을 선호하는지는 중요하지 않습니다.
답변
#include <type_traits>
std::add_pointer<int>::type test, test2;
답변
4, 5 및 6에서 test
항상 포인터이며 포인터 test2
가 아닙니다. 공백은 C ++에서 거의 중요하지 않습니다.