programing

왜 우리는 공허함 이외의 다른 점들을 가지고 있는 거지?

javajsp 2023. 10. 21. 09:56

왜 우리는 공허함 이외의 다른 점들을 가지고 있는 거지?

저는 우리가 다른 포인터를 가지고 있다는 것을 압니다.int,float,그리고.char.A.void포인터는 다른 모든 포인터를 담을 수 있는 유일한 포인터입니다.

다른 포인터들은 포인터 연산을 할 수 있는 유연성을 위해서만 존재합니까?

그 외에 다른 이유가 있나요?voidC언어로 존재합니까?

타입 세이프티.포인터의 유형을 정의하면 컴파일러가 포인터를 통해 잘못된 유형의 데이터를 사용하려고 할 때 오류를 찾는 데 도움이 됩니다.그것이 C가 애초에 타입이 있는 이유입니다.

컴파일러는 지적된 유형을 알아야 합니다. 그렇지 않으면 모든 종류의 코드가 작동하지 않습니다.다음을 고려합니다.

*a = *b + *c; // char를 추가해야 합니까? int? float?
s_ptr->x = 0; // 컴파일러는 s_ptr이 가리키는 구조에 대해 어떻게 알고 있습니까?
a[5] = 0; // a[0]와 a[5]의 거리는 얼마나 됩니까?

포인터에 대한 유형이 없다는 것은 어떤 것에도 유형이 없다는 것과 같습니다.컴파일러가 완전히 분실될 것입니다.간단히 말해서, C와 C++는 모두 강력하게 타이핑되어 있고 이것은 꽤 명백한 이유로 포인터로 이어집니다.

int o = 12;
void *i = &o;

당신은 어떻게 접근하겠습니까?ivoid pointer만 있고 int*는 없는 경우를 가리킵니다.플랫폼에서 int는 4바이트이므로 void*가 가리키는 것이 무엇이든 시작부터 4바이트를 임시 int로 메모한 후 사용할 수 있습니다.하지만 그건 그리 편리하지 않습니다.

또는 주어진.

struct Pair {
   char *first;
   char *second;
};

구조 쌍에 대한 빈 포인터가 얼마나 유용합니까?당신은 아마도 그것에 접속하고 싶을 것입니다.first구성원이고 구조 쌍에 대한 포인터를 가질 수 없다면 그것은 많은 일입니다.

사실, 그것은 설명되어야 할 "공허의 점"입니다.

프로그래밍 언어는 일반적으로, 특히 C는 유형을 좋아합니다.유형은 우리가 바보 같은 짓을 하고 있는지를 확인하는 기본 안전망입니다. 여기서 "멍청한"은 "그들이 아닌 것을 위해 많은 비트를 해석하는 것"을 의미합니다.타입이 없어도 프로그래밍이 가능하고, 어떤 종류의 타입(어셈블리나 Forth)이 전혀 없는 언어도 있지만, 이것은 심약한 사람들을 위한 것은 아니며, 일반적으로 말하면, 타입을 사용함으로써 프로그래머의 생산성이 크게 향상되는 것처럼 보입니다.

따라서 포인터가 있으면 컴퓨터가 포인터 끝에서 무엇을 찾을 수 있는지 알 수 있기를 바랍니다.우리는 컴퓨터가 포인터 끝에 있는 비트를 볼 때 다른 것이 아니라 "int"로 보도록 "pointer to int"를 원합니다.

"공허로 향하는 포인터"는 C의 유형 시스템이 우리가 하고 있는 것을 포착하지 못할 때 사용하는 무유형 포인터입니다.C가 우리가 생성하고 있는 코드의 복잡성을 따라가지 못하는 증상입니다(또는 프로그래머가 C 유형 시스템의 제약 조건 내에서 자신이 하는 일을 표현하기에 충분하지 않았을 수도 있습니다).따라서 어떤 상황에서는 "void *"가 편리하지만, 그것을 예외로 보고 회피하기 위해 노력해야 합니다.

C의 포인터 유형은 참조 해제를 시도할 경우 읽을 메모리 블록의 크기를 컴파일러에 알려줍니다.즉, int 포인터를 다시 참조할 때 컴파일러는 주소 뒤에 4바이트를 읽어야 한다는 것을 알게 됩니다.따라서 입력된 포인터에 캐스트하지 않고 회피 포인터를 재참조하는 것이 금지됩니다. 이 경우 컴파일러는 주소 뒤에 읽을 바이트 수를 알 수 없습니다.

매우 간단합니다.

void* p;
*p; // compile error!

또는 말로 표현하자면, 공백 포인터는 역참조할 수 없습니다.

아마도 당신은 왜 우리가 포인터를 가지고 있는가, 아니면 그렇지 않고 SO에서 해당 질문을 검색해야 할 것입니다.

포인터를 사용하여 float 또는 int(예: int*의 경우 (int) 크기) 컴파일러는 메모리에서 필요한 바이트 수를 알고 있습니다.

void 예를 들어 some_void_ptr을 (int*) 작성하여 컴파일러에 필요한 바이트 수를 매번 알려주어야 합니다.

하지만 이는 매우 단순화된 것입니다.

C언어에 void 이외의 pointer가 존재하는 다른 이유가 있습니까?

메모리 청크를 자유롭게 처리할 수 있는 멋진 방법입니다. :)

포인터가 가리키는 메모리 블록을 반복할 때는 메모리에 포함된 데이터 유형의 크기를 알아야 합니다.둘 다 바이트 X에서 메모리를 가리키는 charptr과 intptr 두 개의 포인터가 있다고 가정해 보겠습니다. charptr+1은 바이트 X+1을 가리키고 intptr+1은 바이트 X+4를 가리킵니다.

다음을 설명하기 위해 잘못 작성된 코드의 빠르고 더러운 조각:

#include <stdio.h>

int main()
{
    char * cptr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    short * sptr = (short*)cptr;
    int * iptr = (int*)cptr;
    long long * lptr = (long long*)cptr;

    printf ("CHAR: %d, +1: %d\n",cptr,cptr+1);
    printf ("SHORT: %d, +1: %d\n",sptr,sptr+1);
    printf ("INT: %d, +1: %d\n",iptr,iptr+1);
    printf ("LONG LONG: %d, +1: %d\n",lptr,lptr+1);
}

다음을 수행해야 합니다.

  • 다양한 크기(형식 안전)의 주조 포인터에 대한 경고 발생,
  • 첫 번째 열의 동일한 숫자(모든 포인터는 메모리의 동일한 주소를 가리킴)를 출력하지만 두 번째 열의 다른 숫자(기본 주소 + 포인터 유형의 크기: 1, 2, 4, 8바이트)를 출력합니다.

Type Safety 두 단어

C 위키피디아의 유형 안전성(또는 유형 안전성의 결여)에 대한 약간의 정보가 있습니다.

이 질문은 제가 본 거의 모든 튜토리얼에서 새로운 C++ 프로그래머들에게 망치로 내리치는 흔한 오해에서 비롯됩니다. 그 포인터는 메모리에 있는 주소입니다.

하지만 프로그래머의 관점에서는 그렇지 않습니다.그렇다면 메모리 주소(또는 OS가 애플리케이션에 제공하는 가상 주소의 오프셋)를 가리키는 단순한 int 유형(32/64bit)을 가질 수 있습니다.

그러나 포인터가 가리키는 데이터 유형의 크기를 알아야 하며, 순식간에 매우 지저분해질 수 있습니다.

하지만 질문 자체는 C++를 처음 접하는 사람에게는 매우 유효합니다.

언급URL : https://stackoverflow.com/questions/2200404/why-do-we-have-pointers-other-than-void