null 포인터와 void 포인터의 차이점은 무엇입니까?
Null 포인터와 Void 포인터의 차이점은 무엇입니까?
Null 포인터는 포인터의 특별한 예약 값입니다.모든 유형의 포인터에는 이러한 예약된 값이 있습니다.형식적으로는 각 특정 포인터 타입(int *
,char *
etc)에는 전용 늘값(null-discriptions)이 있습니다.개념적으로 포인터의 값이 늘일 경우 포인터는 아무 데도 가리키지 않습니다.
보이드 포인터는 특정 포인터 유형입니다.void *
- 스토리지에서 특정 유형이 없는 데이터 위치를 가리키는 포인터입니다.
다시 말하지만 늘 포인터는 값이고 보이드 포인터는 유형입니다.이 개념들은 완전히 다르며 비교할 수 없습니다.이는 기본적으로 귀하의 질문이, 언급된 바와 같이, 정확히 유효하지 않다는 것을 의미합니다.예를 들어, "삼각형과 자동차의 차이점은 무엇인가?"라고 묻는 것과 같다.
두 가지 다른 개념: "void pointer"는 유형(void *)입니다."NULL 포인터"는 값이 0(NULL)인 포인터입니다.예:
void *pointer = NULL;
그건 무효 포인터야
늘 포인터는 포인터와 동일한 오브젝트를 비교하지 않을 것을 보증합니다.실제 값은 시스템에 따라 다르며 유형에 따라 다를 수 있습니다.null을 얻으려면int
할 수 있는 포인터
int* p = 0;
Null 포인터가 반환됩니다.malloc
실패했을 때
포인터가 null인지 테스트할 수 있습니다(예: 포인터가 null인지 여부).malloc
또는 부울값을 테스트하는 것만으로 다른 함수가 실패하는 경우도 있습니다.
if (p) {
/* Pointer is not null */
} else {
/* Pointer is null */
}
보이드 포인터는 모든 유형을 가리킬 수 있으며 참조된 객체가 참조 및 포인터 계산을 위해 소비하는 메모리의 양은 사용자에게 달려 있습니다.
보이드는 유형을 말합니다.기본적으로 그것이 가리키는 데이터의 유형은 알려져 있지 않습니다.
Null은 값을 나타냅니다.기본적으로 아무것도 표시되지 않는 포인터이므로 사용할 수 없습니다.
둘다요.void
그리고.null
포인터는 마지막에 메모리 위치를 가리킵니다.
A null
포인터는 일반적으로 메모리 세그먼트의 0번째 주소인 (메모리 세그먼트에서) 위치를 가리킵니다.읽기/쓰기 또는 참조 해제를 위해 접근하려고 할 때 기본 OS가 "예약된" 메모리 위치(실장 세부 정보)를 어떻게 취급하는지가 대부분입니다.예를 들어 특정 메모리 위치를 "액세스 불가"로 표시하고 액세스 시 검사를 발생시킬 수 있습니다.
A void
포인터는 임의의 타입을 가리킬 수 있으며 잠재적으로 모든 타입(sypot, reference-type 및 include)을 나타낼 수 있습니다.
누군가 친절하게 말한 것처럼null
포인터는 값을 나타냅니다.void*
는 값보다 많은 유형을 나타냅니다.
Null 포인터 포인터 포인트에는 다음과 같은 값이 있습니다.NULL
일반적으로 0이지만 어떤 경우에도 참조 해제에 유효하지 않은 메모리 위치입니다.보이드 포인터는 보이드 유형의 데이터를 가리킵니다."void"라는 단어는 포인터가 참조하는 데이터가 잘못되었거나 포인터가 무효화되었음을 나타내는 것이 아닙니다.
보통 null 포인터(void 포인터 포함)는 다음을 가리킵니다.
주소 0: 대부분의 CPU 명령 세트가 ISA에 대한 최적의 코드 크기/성능으로 매우 빠른 비교 및 분기(초기화되지 않았거나 비활성 포인터 확인 등)를 수행할 수 있습니다.
사용자 코드가 액세스 할 수 없는 주소(대부분의 경우 0x000000 등)입니다.따라서 코드가 실제로 이 주소 또는 그 근처에 있는 데이터에 액세스하려고 하면 OS 또는 디버거가 이 버그로 인해 프로그램을 쉽게 중지하거나 트랩할 수 있습니다.
보이드 포인터는 보통 다른 유형으로 사용하기 위해 포인터를 한 유형 또는 알 수 없는 유형으로 반환하는 경우 커닝하거나 컴파일러 유형 검사를 끄는 방법입니다.instance malloc()의 경우 타입이 없는 메모리 청크로 void 포인터를 반환합니다.이 타입은 나중에 바이트, 쇼트 int, 더블 플로트, typePoto's 등의 포인터로 사용할 수 있습니다.
NULL
는 모든 포인터 유형에 유효한 값입니다.값이 없음을 나타냅니다.
보이드 포인터는 유형입니다.모든 포인터 유형은 보이드 포인터로 변환할 수 있으므로 임의의 값을 가리킬 수 있습니다.이것은 일반 보관에는 좋지만 사용에는 좋지 않습니다.그 자체로는 값에 액세스할 수 없습니다.프로그램에 추가 컨텍스트가 있어야 void 포인터가 참조하는 값의 유형을 알 수 있습니다.
null 포인터와 void 포인터는 완전히 다릅니다.운영체제시스템(clangauge의 malloc() 경유)에 특정 데이터 타입의 메모리를 할당하도록 요구하면 운영체제시스템은 메모리를 힙으로 할당하고 할당한 메모리의 주소를 송신합니다.
메모리가 os에 의해 힙으로 할당되면 해당 데이터 유형의 포인터 유형 변수에 이 주소 값을 할당할 수 있습니다.이 포인터는 어떤 프로세스에서도 사용되지 않을 때까지 보이드 포인터라고 불립니다.
공간을 힙으로 사용할 수 없는 경우 운영체제는 메모리를 할당하고 해당 위치의 주소 값을 전송합니다.그러나 이 메모리는 힙에 공간이 없기 때문에 OS에 의해 힙에 할당되지 않습니다.이 경우 이 메모리는 시스템메모리의 OS에 의해 할당됩니다.사용자가 이 메모리에 액세스할 수 없으므로 포인터에 이 주소 값을 할당하면 이 포인터는 늘 포인터라고 하며 이 포인터를 사용할 수 없습니다.보이드 포인터의 경우 모든 프로그래밍 언어의 프로세스에 사용할 수 있습니다.
AnT의 답이 틀린 것 같아요.
NULL
포인터 상수일 뿐인데, 그렇지 않으면 우리가 어떻게ptr = NULL
.- ~하듯이
NULL
어떤 타입인지 포인터입니다.제 생각에 그 타입은(void *)
그렇지 않으면 어떻게 둘 다 가질 수 있을까요?int * ptr = NULL
그리고.(user-defined type)* ptr = NULL
.void
type은 실제로는 범용 타입입니다. - "C11(ISO/IEC 9899:201x)" "6.3.2.3 포인터 섹션 3"에서 인용:
값이 0인 정수 상수 표현식 또는 void * 유형에 주조된 표현식을 null 포인터 상수라고 합니다.
★★★★★★★★★★★★★★★★★★★★★★★:NULL
이치노
Null 포인터의 값은 0입니다.void 포인터는 ANSI에 의해 도입된 범용 포인터입니다.범용 포인터는 모든 데이터 유형의 주소를 포함할 수 있습니다.
언급URL : https://stackoverflow.com/questions/3581585/whats-the-difference-between-a-null-pointer-and-a-void-pointer
'IT이야기' 카테고리의 다른 글
Safari용 vue-devtools 확장이 있습니까? (0) | 2022.06.04 |
---|---|
라우터 뷰 콘텐츠가 렌더링되지 않음 (0) | 2022.06.04 |
GCC가 비지 대기 루프를 최적화하지 않도록 하려면 어떻게 해야 합니까? (0) | 2022.06.04 |
Jest에서 VueJ(Nuxt) 스토어를 테스트하는 방법 (0) | 2022.06.04 |
Vuex Module Getter에 액세스할 수 없음 - 정의되지 않은 속성 'getters'를 읽을 수 없음" (0) | 2022.06.04 |