programing

포인터 선언에 데이터 유형이 필요한 이유는 무엇입니까?

stoneblock 2023. 6. 18. 10:10

포인터 선언에 데이터 유형이 필요한 이유는 무엇입니까?

변수를 선언하면서 C/C++의 데이터 유형에 대해 알고 있는 바로는, 데이터 유형을 선언해야 합니다. 그러면 컴파일러가 메모리의 바이트 수를 그에 따라 예약하도록 합니다.

그러나 포인터의 경우 포인터가 메모리 주소를 부호 없는 정수로 저장하고 있기 때문에 포인터가 가리키는 변수의 데이터 유형에 관계없이 크기가 일정하다는 것을 알고 있습니다(예: "터보 컴파일러"에서 2바이트).

제 질문은 포인터가 항상 일정한 크기(바이트 단위)라면 데이터 유형을 언급하면서 선언할 필요가 무엇입니까?포인터에 대한 제 이해가 잘못된 건가요?

포인터가 읽어야 할 데이터 양을 알 수 있도록 포인터를 참조 해제할 때 데이터 유형이 필요합니다.예를 들어 참조 해제 achar포인터가 가리키는 주소에서 다음 바이트를 읽어야 합니다.int포인터가 2바이트여야 합니다.

포인터의 데이터 유형은 다음과 같은 두 가지 상황에서 필요합니다.

  1. 포인터 참조 해제
  2. 포인터 산술

포인터를 참조 해제하는 데 어떻게 사용됩니까?
다음 예를 생각해 보십시오.

    {
        char *k; //poniter of type char
        short j=256;
        k=&j;    // Obviously You have to ignore the warnings
        printf("%d",*k)
    }

k는 유형이기 때문에char1바이트만 읽을 수 있습니다.이제 이진수 값:256이라0000000100000000하지만 k는 타입이기 때문에char따라서 첫 번째 바이트만 읽으므로 출력은 0이 됩니다.
참고: j=127을 할당하면 127이 첫 번째 바이트로 유지되기 때문에 출력이 127이 됩니다.

이제 포인터 산술에 대해 설명하겠습니다.
다음 예를 생각해 보십시오.

    {
        short *ptr;
        short k=0;
        ptr=&k;
        k++;
        ptr++;// pointer arithmetic
    }

Are 문k++그리고.ptr++같은 것입니까?아니요.k++수단k=k+1그리고.ptr++수단ptr=ptr+2컴파일러는 이것이 포인터이고 그것이 짧은 것을 가리킨다는 것을 알기 때문에, 그것은 1 대신 2 ttr을 추가하기 때문에 포인터는 다음 정수를 가리킵니다.

자세한 내용은 이 튜토리얼의 두 번째 장을 참조하십시오.

우선 포인터 자체의 크기와 표현이 유형에 따라 항상 같지는 않습니다.이는 많은 구현에서 발생하는 일입니다.

둘째, 포인터를 사용할 때 포인터 자체의 크기에 대해 신경 쓰지 않습니다.당신은 뾰족한 타입의 사이즈가 필요합니다.

예를 들어, 다음을 시도합니다.

int var[5];
char *c = (char *)var;
int  *x = var;

printf("%p\n%p\n", p + 1, x + 1);

포인터 산술은 포인터 유형의 크기에 따라 크게 달라집니다.

문제는 포인터 크기가 아니라 포인터 참조 해제입니다.(C 또는 C++로 표시)

예를 들어 다음과 같습니다.

int* someint;
float* somefloat;

*someint를 메리 크참조의 기준으로 합니다.sizeof(int)에, 면에반에.*somefloat를 메리 크참조의 기준으로 합니다.sizeof(float)어떤 것이 다른지.

포인터에 필요한 크기는 사용 중인 시스템에 따라 다릅니다.x86_64시스템 포인터 크기가 64비트일 수 있습니다.

포인터에 대한 데이터 형식이 필요한 이유는 컴파일러가 포인터가 가리키는 메모리 셀의 크기를 알아야 하기 때문입니다.또한 형식이 없으면 형식 안전을 보장할 수 없습니다.또한 포인터에서 구조물에 액세스할 때 모든 포인터를 타이프캐스트해야 합니다.

여러분은 사한할수있다니를 .void포인터로 모든 것을 손으로 합니다.그런데 왜 그걸 원하죠?

이 코드가 원하는 대로 오류 없이 컴파일된다고 가정합니다.

int a;
int b = 42;
void * d = &b;

a = *d;

a의 값은 얼마여야 합니까?

이제 이것으로:

int a;
float b = 42.0;
void * d = &b;

a = *d;

당신은 무엇을 기대합니까?

실제로 유형은 지정된 영역을 해석하는 방법을 지정합니다.은 지야합다를 지정해야 .int * 번째 와 첫번예시와에서float *대에신 두번것에서째것서▁in.void *.

데이터 유형은 단순히 유형 확인을 위해 필요합니다.

이것은 c++에서 사용되는 강력한 타이핑의 개념입니다. 포인터의 크기는 같을 수 있지만 뾰족한 타입의 크기는 다를 수 있습니다.그러나 한 유형의 포인터를 다른 유형의 포인터에 항상 캐스팅할 수 있습니다.

언급URL : https://stackoverflow.com/questions/9802585/why-is-the-data-type-needed-in-pointer-declarations