이 도움이 될 수 있습니다. 공식 매개 변수 유형 void **를 부여 할 수 있습니까?
void f(void **);
double *dp;
f((void **)&dp);
A : 휴대 할 수 없습니다. 이와 같은 코드가 작동하고 때로는 권장되는 경우도 있지만, 내부 표현이 같은 모든 포인터 유형 (일반적이지만 일반적인 것은 아닙니다. 질문 5.17 참조)에 의존합니다.
void *는 void (*)에 다른 포인터 유형이 할당 될 때 자동으로 적용되기 때문에 일반 포인터로 사용됩니다. void * 이외의 포인터 유형을 가리키는 void ** 값에 간접적 인 시도가있을 경우 이러한 변환을 수행 할 수 없습니다. void ** 포인터 값을 사용할 때 (예를 들어 * 연산자를 사용하여 void **가 가리키는 void * 값에 액세스 할 때) 컴파일러는 void * 값이 한 번인지 여부를 알 수 없습니다 다른 포인터 유형에서 변환됩니다. 그것은 무언가 이상이라고 가정해야합니다 *; 암시 적 변환을 수행 할 수 없습니다.
즉, 사용자가 재생할 void ** 값은 어딘가에 실제 void * 값의 주소 여야합니다. (void **) & dp와 같은 캐스트는 컴파일러를 닫을 수도 있지만, 이식성이 없다. (그리고 원하는 것을하지 않을 수도있다; 질문 [*] 13.9를 참고). void **가 가리키는 포인터가 void *가 아니고 void *와 다른 크기 나 표현을 가진다면 컴파일러는 올바르게 접근하지 못할 것입니다.
가 주어진 코드를 동작하게 만들려면, 당신은 void * 타입 변수 : 컴파일러에게 필요한 경우, 어떤 변환을 수행 할 수있는 기회를 제공 및 부사장에서
double *dp;
void *vp = dp;
f(&vp);
dp = vp;
과제물.
또 다른 포인터 유형은 크기 나 표현이 다를 수 있으며, 희귀하지만 전례가없는 것으로 가정합니다. void **의 문제를보다 명확하게 이해하려면 상황을 int 및 double 유형과 관련된 유사 유형과 비교하십시오. 아마도 크기가 다르며 확실히 다른 표현을 가질 것입니다. 우리는 함수를
void incme(double *p)
{
*p += 1;
}
이있는 경우 다음이 ** 코드 보조 부사장을 포함하는 올바른 무효 유사하다 (우리는
int i = 1;
double d = i;
incme(&d);
i = d;
처럼 뭔가를 할 수와 나는 1 씩 증가됩니다.반면에, 우리는 (이 코드는 질문에 나온)
int i = 1;
incme((double *)&i); /* WRONG */
같은 것을 시도했다, 경우), 작동 할 가능성은 희박하다.
이 경우를 C의 유일한 질문입니다 C++ 태그를 제거하십시오 –
흠 ... "나는 망치로 손가락을 때리면 커다란 시간을 아프게합니다. 망치로 신체 부위를 때릴 때 어떤 접근 방식을 사용합니까?" – sharptooth
void *를 사용하는 C 제네릭 프로그래밍이 우아하고 사용하기에 좋다고 생각한다면 qsort 함수를 사용하기 위해해야 할 일을 살펴보십시오 ... –