2010-05-01 4 views
0

아래의 2 가지 선언을 고려하십시오.포인터 변수 선언을위한 다른 유형

*은이 개 선언 사이 intepretation에 어떤 차이가 있습니까

char* ptr1, * ptr2, * ptr3; //all 3 are pointers 

*

char *ptr1,*ptr2,*ptr3; //again all 3 are pointers 

를 데이터 유형 옆에있는 변수 옆에하지 나타납니다 다음 변수

옆에있는 데이터 유형이 아닌 나타납니다 . 나는 변수에 차이가 없다는 것을 안다.

void 포인터를 소개하는 이유는 무엇입니까?

답변

5

유일한 차이점은 공백이며 결국 포인터를 문자로 만듭니다. 나는 개인적으로 char * ptr1을 사용한다. 내 코드에서 많은 공백을 사용한다.

보이드 포인터는 모든 유형의 객체를 가리킬 수 있으며 크기가 없습니다. 예를 들어,이 작품 (하지만 정말 좋은 생각이 아니다) :

int * ptr1; 
float * ptr2; 
(*ptr1) = 17; 
ptr2 = (void*)ptr1; 

(*ptr2)

지금 플로트 대신 int로서 PTR1의 바이트를 해석합니다, 당신에게 다른 결과를 제공합니다. 형식간에 변경할 수 있습니다. 함수에 대한 포인터 typedef에도 마찬가지로 void*을 사용합니다.

또한 char * ptr1이고 ptr1++ 인 경우 ptr1의 주소는 sizeof(char)으로 증가합니다. void *로는 불가능합니다. 어떤 크기로 증가할지 알지 못한다는 컴파일러 오류를줍니다.

1

void 포인터는 알 수없는 데이터에 대한 포인터이므로 모든 유형으로 형변환 될 수 있으므로 형식이 잘못되어 프로그램이 중단 될 수 있습니다. 전체 변형이 필요한 경우 boost :: any를 사용하십시오.
선언간에 차이점은 없습니다.

1
  1. 유일한 차이점은 무의미한 공백입니다. *이 "데이터 유형 옆에 표시되지 않습니다"또는 "변수 옆에 표시되지 않습니다."- char*a,*b;으로 쓸 수도 있습니다. 중요한 것은 우선 순위입니다. *은 오른쪽에 바인드되므로 변수 이름에 바인드됩니다. 즉, char* a, b;char (*a), b;과 같으며 두 개의 포인터가 아닌 ab 인 char에 대한 포인터가됩니다. 두 개의 포인터가 필요하다면 예제에서와 같이 char *a, *b;을 사용해야합니다.
  2. void 포인터는 유형을 지정하지 않고 메모리에 대한 포인터입니다. 이것은 다양한 유형의 데이터를 받아 들여야하는 함수를 작성할 때 유용합니다. 예를 들어, c 라이브러리 함수 memcpy()은 임의의 데이터를 복사합니다. 전달되는 데이터는 중요하지 않습니다. 이 함수를 구현할 때 전달할 데이터가 무엇인지 모르기 때문에 void*을 사용해야합니다. 그렇지 않으면 전달할 수있는 각 데이터 유형 (조합)에 대해 memcpy() 함수가 필요합니다. 이것은 c 라이브러리 함수이고 c는 함수 오버로드를 지원하지 않으므로 다른 이름을 가진 많은 memcpy() 함수가 필요합니다.
1

void pointer는 데이터 형식이 없으므로 모든 유형의 데이터를 가리키는 데 사용할 수 있습니다. 그러나 데이터 유형을 알 수 없으므로 직접 포인터를 비평가 할 수있는 방법이 없습니다.이렇게하려면 포인터를 특정 데이터 형식으로 캐스팅해야합니다.

무효 포인터가 적용되는 상황 : 경우에 따라 함수가 다른 유형의 데이터를 허용하도록 할 수 있습니다. int, char, double 등, 템플릿을 사용할 수도 있습니다. (오버로드 된 기능은 옵션이지만 가장 효율적인 방법은 아닙니다.) 이 목적을위한 또 다른 방법은 void 포인터를 사용하는 것입니다.

FUNCTIONNAME 보이드 (공극 * 데이터 입력 PARAM) {/ * 두번째 인수 PARAM에 기초 데이터를 원하는 방식으로 처리 될 수 있도록 포인터가 데이터 역 참조. */ }

그냥 알림 : 그들이 사용 및 기능의 다른 목적을 가지고처럼 무효 포인터와 널 포인터가 구별되어야한다. 후자는 포인터 유형을 가지고 있지만 모든 데이터의 유효한 주소를 가리 키지는 않습니다.

0

나는 C + + 프로그래머에게 질문하면 왼쪽에 넣고 오른쪽에 C 프로그래머라고 말하면서 농담을 들었다.

궁극적으로 유형 이름이 아닌 변수에 *가 바인딩되기 때문에 분명히 코드를 명확하게 만들려면 오른쪽에 넣는 것이 좋습니다. 그러나 C++에서는 원시 포인터를 처리 할 이유가 거의 없기 때문에 문제가 발생하지 않습니다.

+1

"의심의 여지없이"? 그래서 당신은 C++ 프로그래머가 "의심 할 여지없이"잘못된 것을한다고 말하고 있습니까? 일부는 왼쪽에 넣는 이유는 더 직관적 인 이유입니다. 형식 지정의 일부입니다. 당신은 int가 아닌 int 포인터를 만들고 있습니다. 당신의 관점에 따라 두 옵션 중 어느 것이 가장 정확합니다. – jalf

+1

"의심 할 여지없이"! = 중요. 항상 마지막 문장의 요점이었던 것이 더 나은 생각이 아니더라도 항상 개인적으로 왼쪽에 넣습니다. – Puppy