2016-08-08 2 views
0

특정 유형의 포인터를 선언하는 중에 실제로 어떻게됩니까? 포인터 산술 또는 인덱싱 이외의 포인터에 유형을 지정하는 용도가 있습니까?포인터 유형을 지정하는 이유는 무엇입니까?

+4

유형이 없으면 포인터가 가리키는 점을 어떻게 알 수 있습니까? – RedX

+0

위치가 할당 된 데이터 유형을 모른 채 포인터를 통해 메모리 위치에 데이터를 쓰는 방법은 무엇입니까? – haccks

+1

관련 또는 중복 : [C++에서 포인터 변수와 참조 변수의 차이점은 무엇입니까?] (http://stackoverflow.com/q/57483/514235) – iammilind

답변

2

유형은 다음 포인터를 역 참조의 예는 다음과 같은 경우 포인터를

  • 포인터 연산
  • 간접 참조

    • 필요하다.

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

      지금은 하나의 바이트를 읽을 수 있도록 ptr는 char 형의이기 때문이다. 그러나 256의 이진 값은 0000000100000000이지만 ptr은 유형이 char이므로 첫 번째 바이트 만 읽으므로 출력은 0이됩니다.

      참고 : j = 127을 지정하면 127이 첫 번째 바이트로 유지되므로 127이됩니다. 이제

      , pointer arithmetic의 예 : 문 var++

      { 
          int *ptr; 
          int var=0; 
          ptr=&var; 
          var++; 
          ptr++;// pointer arithmetic 
      } 
      

      하고 ptr++이 같은 일입니까? 아니, var++var=var+1을 의미하고 ptr++ptr=ptr+4을 의미합니다. 컴파일러는이 포인터를 가리키며 포인터가 int을 가리키므로 4ptr에 1 대신 추가하므로 포인터가 다음 정수를 가리키고 있습니다.

    9

    이유 중 하나는 포인터를 역 참조 할 때 읽어야 할 바이트 수를 알아야한다는 것입니다. Dereferencing char 포인터는 int의 경우 메모리에서 1 바이트를 가져 오는 것을 의미하지만 4 바이트가 될 수 있습니다.

    +0

    그게 전부입니까? 나는 대답이 "당신이해야하기 때문에"- auto x = * ptr;, func (* ptr); ... – LogicStuff

    +0

    @LogicStuff 내가 당신을 쫓고 있는지 미안하다고 생각했습니다. 부족한 점이 있으면 다른 답변을 추가하십시오. 나는 또한 질문이 그것 같이 표를 붙여 졌기 때문에 주로 C 관점에서이 질문에 대답했다. –

    +0

    오, 그럼. 이 질문에 대한 첫 번째 의견을 말하고있는 것입니다. – LogicStuff

    0

    포인터를 역 참조 할 때 데이터 유형이 필요하므로 읽어야하는 데이터의 양을 알 수 있습니다.

    예를 들어, dereferencing char 포인터는 가리키는 주소에서 다음 바이트를 읽어야하고 int 포인터는 2 바이트를 읽어야합니다.

    더 이것을 참조 :

    int *ip; /* pointer to an integer */ 
    
    double *dp; /* pointer to a double */ 
    
    float *fp; /* pointer to a float */ 
    
    char *ch  /* pointer to a character */ 
    

    실제 데이터 유형 : Why is it necessary to declare the types that pointers point to?

    1

    포인터 값이 포인터 타입에 대한 다른 변수

    여기

    있는 몇 가지 예 주소 인 변수 integer, float, character 또는 다른 포인터와 같은 모든 포인터의 값은 메모리 주소를 나타내는 긴 16 진수로 동일합니다.

    다른 데이터 유형의 포인터의 유일한 차이점은 데이터 변수의 종류 나

    +0

    이것은 모두 정의가 좋습니다. 나는 질문이 포인터의 사용에 대해 더 많은 것, 그것이 당신이 데이터 타입을 아는 것에 또한 얻는 것이라고 생각한다? –

    +0

    "모든 포인터 값의 실제 데이터 유형은 ... 동일합니다." 그건 (반드시) 사실이 아닙니다. 단어로 주소가 지정된 컴퓨터는 단어의 주소 (일반적으로 정수, 부동 및 구조 포인터 포함)에 대해 하나의 데이터 유형을 사용할 수 있으며 단어의 주소 + 단어 내의 오프셋 (char 포인터 및 void 포인터). 분할 된 아키텍처는 "함수 포인터"에 대해 다른 유형을 사용하는 경우가 많습니다. 마지막으로 완전히 다른 짐승 인 "멤버 함수 포인터"/ "멤버 함수 포인터"의 모든 재미와 게임이 있습니다. –

    0

    포인터 포인터 포인트는 또한 클래스의 유효한 오브젝트를 가리키는 지 일정하다. 유형이없는 경우 클래스 구성원에게 액세스하기위한 정보를 얻을 수 없습니다. 포인터

    class CPerson 
    { 
        public: 
         std::string GetName(); 
    }; 
    
    CPerson oPerson; 
    CPerson *pObj_1 = &oPerson; 
    pObj_1->GetName(); 
    
    void *pObj_2 = &oPerson; 
    pObj_2-> ?? // what all I can access now ? 
    
    1
    • 크기 : 몇 바이트까지 액세스합니까? 1 바이트의 char 읽기/쓰기는 long ≥ 4 옥텟을 쓰는 것과 같지 않습니다.
    • 정렬 : 두 가지 유형은 길이가 같지만 정렬이 다를 수 있습니다. 하나의 데이터 유형을 특수 레지스터에 넣고이 레지스터에서 /로 이동하는 메모리는 특별한 정렬 요구 사항을 갖습니다.
    • 표현 : 동일한 sizeof_Alignof 일지라도 표현이 다를 수 있습니다. *float_ptr = 4을 지정하면 44.0으로 변환됩니다.
    • 유형 안전 : void **ptr1, **ptr2; *ptr1+*ptr2;과 같은 중대한 위법 행위가 탐지 될 수 있습니다.
    관련 문제