이것이 의미하는 바는 무엇일까요? 무효가 되는 포인터는 다른 포인터와 결코 동일하지 않을 것입니다.
제 친구 중 한 명이 "C Pointers의 이해와 사용 - Richard Reese, O'Reilly publications"에서 두 번째 총알 포인트를 지적했는데, 저는 그 첫 번째 문장을 설명할 수 없었습니다.제가 무엇을 빠뜨리고 있나요?
빈 곳으로 포인터
공백 포인터는 모든 데이터 유형에 대한 참조를 유지하는 데 사용되는 범용 포인터입니다.아래에는 무효 포인터의 예가 나와 있습니다.
void *pv;
두 가지 흥미로운 속성을 가지고 있습니다.
- 는 void 에로의 한 표현과 을 갖습니다.
char
.- void의 포인터는 다른 포인터와 결코 동일하지 않습니다.하지만, 두 개의 보이드 포인터가 A를 할당했습니다.
NULL
값은 같습니다.
이것은 제 코드이고, 책에서 나온 것이 아니고 모든 포인터가 같은 값을 가지고 있고 같습니다.
#include <stdio.h>
int main()
{
int a = 10;
int *p = &a;
void *p1 = (void*)&a;
void *p2 = (void*)&a;
printf("%p %p\n",p1,p2);
printf("%p\n",p);
if(p == p1)
printf("Equal\n");
if(p1 == p2)
printf("Equal\n");
}
출력:
0x7ffe1fbecfec 0x7ffe1fbecfec
0x7ffe1fbecfec
Equal
Equal
TL/DR: 책이 틀렸습니다.
제가 무엇을 빠뜨리고 있나요?
아무것도 없어요, 제가 볼 수 있는 한.심지어 댓글로 제시된 에라텀 버전도...
void의 포인터는 void의 다른 포인터와 결코 동일하지 않습니다.
... 단순히 C 언어 사양에서는 지원되지 않습니다.저자가 언어 사양에 의존하는 범위 내에서 관련 텍스트는 6.5.9/6항입니다.
두 포인터가 null 포인터인 경우와 둘 다 동일한 객체에 대한 포인터(객체에 대한 포인터와 그 시작에 하위 객체를 포함) 또는 함수인 경우, 둘 다 동일한 배열 객체의 마지막 요소에 대한 포인터인 경우에만 두 포인터가 동일합니다.또는 하나는 하나의 배열 객체의 끝을 지나 다른 하나를 가리키는 포인터이고 다른 하나는 주소 공간에서 첫 번째 배열 객체의 바로 뒤에 오는 다른 배열 객체의 시작을 가리키는 포인터입니다.
void
는 개체 유형이지만 "incom완전" 개체 유형입니다.:void
유효하고 null가 아닌 것은 개체에 대한 포인터이며 규격에 의해 표현된 조건에서 서로 동일하게 비교됩니다.른 트)입니다로 입니다.void *
포인터가 가리킵니다 이러한 변환의 결과는 원래 포인터가 했던 것과 동일한 개체를 여전히 가리킵니다.
제 추측으로는 이 책이 사양을 잘못 해석하여 공백에 대한 포인터를 물체에 대한 포인터로 해석해서는 안 된다는 것입니다.만에 대한 ,void
이 보이드 즉 은 아닙니다.
C 2018 6.5.96은 다음과 같이 말합니다.
두 포인터가 null 포인터인 경우와 둘 다 동일한 객체에 대한 포인터(객체에 대한 포인터와 그 시작에 하위 객체를 포함) 또는 함수인 경우, 둘 다 동일한 배열 객체의 마지막 요소에 대한 포인터인 경우에만 두 포인터가 동일합니다.또는 하나는 하나의 배열 객체의 끝을 지나 다른 하나를 가리키는 포인터이고 다른 하나는 주소 공간에서 첫 번째 배열 객체의 바로 뒤에 오는 다른 배열 객체의 시작을 가리키는 포인터입니다.
그렇다면 다음과 같은 것이 있습니다.
int a;
void *p0 = &a;
void *p1 = &a;
만약에 ,p0
그리고.p1
다".p0 == p1
참인 것으로 평가해야 합니다.다를을한다는 도 있습니다.void *
다에는 아무 .void *
; 원래 형태로 변환하는 데 필요한 정보만 보유하고 있습니다.하지만 우리는 이 해석을 시험해 볼 수 있습니다.
두 포인터가 처음에 개체와 하위 개체를 가리킬 경우 두 포인터가 동일하게 비교된다는 사양을 고려합니다.그것은 주어진 것을 의미합니다.int a[1];
,&a == &a[0]
사실인 것으로 평가해야 합니다. 우리는다를 할 수 .&a == &a[0]
, , 에 조건 때문입니다.==
필요가 둘 중 둘 a입니다.void *
(예를 들어 다음과 같은 자격으로)const
용). 하지만.a
그리고.a[0]
다도 .void
.
그수한 방법은 중 가 되는 것입니다.void *
또는 문자 유형에 대한 포인터(변환 시 특별한 처리가 제공되기 때문에).는 그 할 수 더만,합니다라고 합니다.void *
포함됩니다. 그 는.(void *) &a == (void *) &a[0]
됩니다에 합니다.a
a[0]
그 만 이지만.void *
이 void *
동등한 것으로 비교해야 합니다.
이 C11 기준서 초안의 다음 절은 ('errata'에 언급된 명확성이 GSerg의 주석에 있음에도 불구하고) 이루어진 주장을 완전히 반박합니다.
6.3.2.3
A 가 1개의
void
포인터에서 객체 유형으로 변환할 수 있습니다. 포인터는에 대한 될 수 있습니다.void
결과는 원래의 포인터와 동일해야 합니다.
또는 동일한 표준 초안의 이 섹션:
7.20.1.4할 수
1 가 1개의 합니다를 정수 을 지정합니다.
void
이으로 변환한할 수 .void
하게 됩니다됩니다
intptr_t
포인터는 기억 속의 주소일 뿐입니다.NULL이거나 동일한 주소를 가리키는 경우 두 포인터는 모두 동일합니다.여러분은 구조, 노조 등의 언어로 어떻게 그런 일이 일어날 수 있는지에 대해 계속해서 이야기할 수 있습니다.하지만 결국에는 단순히 기억 위치가 있는 대수에 불과합니다.
- void의 포인터는 다른 포인터와 결코 동일하지 않습니다.두 만 A를했습니다를.
NULL
값은 같습니다.
부터.NULL
그 진술서에 언급되어 있습니다, 저는 그것이 잘못된 유형이라고 생각합니다.다와 .
- 와 .
NULL
포인팅합니다.두 만 A를했습니다를.NULL
값은 같습니다.
, 는 , 와 .NULL
포인팅합니다.
언급URL : https://stackoverflow.com/questions/68610799/what-does-this-mean-a-pointer-to-void-will-never-be-equal-to-another-pointer
'source' 카테고리의 다른 글
MySQL 데이터베이스의 최대 테이블 크기 (0) | 2023.10.14 |
---|---|
PowerShell은 배치 파일에 적합한 업그레이드입니까? (0) | 2023.10.14 |
Windows에서 npm의 캐시 경로를 변경하거나 캐시를 완전히 비활성화하려면 어떻게 해야 합니까? (0) | 2023.10.14 |
CentOS 6.2에서 MySQL 버전을 5.1에서 5.5로 업데이트 (0) | 2023.10.14 |
바운드 매개변수를 여러 번 사용 (0) | 2023.10.14 |