it-source

(정규 객체에 대한 포인터와 반대로) 정칙 포인터는 어떤 용도로 사용됩니까?

criticalcode 2023. 10. 13. 22:18
반응형

(정규 객체에 대한 포인터와 반대로) 정칙 포인터는 어떤 용도로 사용됩니까?

물체를 고정시키기 위해 자주 포인터를 사용했어요, 예를 들면...

const int *p;

수 합니다.p다를 통해 .p도 본이 있습니다 하지만 저는 컨스트 포인터에 대해서도 본 적이 있는데, 이렇게 선언했습니다.

int* const p;

제가 알기로는 포인터 변수 자체가 일정하다는 것을 의미합니다. 하루 종일 가리키는 정수는 바꿀 수 있지만 다른 것을 가리키게 할 수는 없습니다.

그게 무슨 소용이 있겠습니까?

임베디드 시스템을 위한 C 프로그램이나 동일한 메모리(멀티 프로세서 애플리케이션 공유 메모리)를 참조해야 하는 특수 목적 프로그램을 설계할 때는 일정한 포인터가 필요합니다.

예를 들어 32비트 MIP 프로세서LCD가 약간 부착되어 있습니다.저는 제 LCD 데이터를 메모리의 특정 포트에 써야 하고, 그러면 LCD 컨트롤러로 전송됩니다.

나는 그 숫자를 #정의할 수 있지만, 그 다음에 포인터로 캐스팅해야 하고, 그렇게 할 때 C 컴파일러는 옵션이 많지 않습니다.

또한 휘발성이 있어야 할 수도 있고 캐스트할 수도 있지만 제공되는 구문(휘발성 메모리 위치에 대한 상수 포인터)을 사용하는 것이 더 쉽고 명확합니다.

PC 프로그램의 경우 다음을 예로 들 수 있습니다.DOS VGA 게임을 설계하는 경우(기본적인 하위 레벨 그래픽을 배우기 위해 온라인으로 진행하는 튜토리얼이 있음) VGA 메모리에 써야 하며 이는 상수 포인터의 오프셋으로 참조될 수 있습니다.

포인터가 변경되지 않도록 보호할 수 있습니다.즉, 포인터가 변경되지 않거나 의도하지 않은 수정을 방지할 수 있습니다. 예를 들어 다음과 같이 포인터가 변경되지 않을 경우 가정을 보호할 수 있습니다.

int* const p = &i;

...

p++;     /* Compiler error, oops you meant */
(*p)++;  /* Increment the number */

또 다른 예: 초기화된 위치를 알고 있다면 향후 NULL 검사를 피할 수 있습니다.컴파일러는 포인터가 (NULL로) 변경되지 않았음을 보장합니다.

C++ 에서,this입니다 입니다.C * const서,C 클래스 유형 - 것을할 수 있지만 다른입니다 수는 . --것즉,버)만,다를른합니다.C.위해서const수,this유형의const C * const. 또한 (거의 접하지 않음)volatile그리고.const volatile구성원 함수, 대상this또한.volatile한정자

하드웨어 핀과 같은 입출력 장치에 매핑된 특정 주소를 참조해야 하는 로우 레벨(장치 드라이버 또는 내장형) 코드에서 사용할 수 있습니다.일부 언어는 특정 주소에서 변수를 연결할 수 있게 해줍니다(예: Ada hasuse atC에서 가장 관용적인 방법은 상수 포인터를 선언하는 것입니다.그러한 용도는 또한 다음과 같은 것을 가져야 합니다.volatile한정자

방어적인 코딩일 때도 있습니다.변경해서는 안 되는 포인터가 있다면 변경할 수 없도록 선언하는 것이 현명합니다.이렇게 하면 컴파일러(및 보풀 도구)가 이를 수정하려는 잘못된 시도를 탐지할 수 있습니다.

포인터를 의도하지 않게 수정하고 싶을 때(예: 포인터 산술 또는 함수 내부) 항상 사용했습니다.싱글톤 패턴에도 사용할 수 있습니다.

'this'는 하드코딩된 상수 포인터입니다.

"컨틴트"와 마찬가지로 컴파일러가 변경되지 않을 것임을 알고 있다면 이는 이를 바탕으로 한 최적화 가정이 될 수 있습니다.

struct MyClass
{
    char* const ptr;
    MyClass(char* str) :ptr(str) {}

    void SomeFunc(MyOtherClass moc)
    {
         for(int i=0; i < 100; ++i)
         { 
                 printf("%c", ptr[i]);
                 moc.SomeOtherFunc(this);
         }
    }
}

SomeOtherFunc()가 ptr 값을 변경하지 않는다는 것을 알고 있다면 컴파일러는 해당 루프를 최적화하는 데 상당한 도움을 줄 수 있습니다.contst를 사용하면 컴파일러는 그것을 알고 가정을 할 수 있습니다.그것이 없다면, 컴파일러는 SomeOtherFunc가 ptr을 바꿀 것이라고 가정해야 합니다.

코드 외부에서 전달된 개체가 있는 OLE 코드를 본 적이 있는데, 이 개체를 사용하려면 해당 개체가 전달된 특정 메모리에 액세스해야 했습니다.그래서 우리는 함수가 OLE 인터페이스를 통해 들어오는 값보다 항상 값을 조작하는지 확인하기 위해 const pointer를 사용했습니다.

이 질문에 대한 답으로 몇 가지 타당한 이유가 제시되었습니다(메모리 매핑 장치 및 일반적인 오래된 방어 코딩). 하지만 이를 확인할 수 있는 대부분의 경우 실제로 오류이며 항목을 포인터 대 상수로 표시해야 한다는 것을 확신합니다.

저는 이 예감을 뒷받침할 자료가 확실히 없지만, 그래도 내기를 할 겁니다.

type*과 const type*을 type 그 자체로 생각합니다.그런 다음, 왜 그런 유형의 연속체를 가지려고 하는지 알 수 있습니다.

항상 포인터를 int로 생각합니다.이 말은

object* var;

는 사실 을 생각할 수 있습니다.

int var;

따라서, const 포인터는 단순히 다음을 의미합니다.

const object* var;

된다

const int var;

따라서 포인터가 가리키는 주소도 변경할 수 없습니다. 그게 전부입니다.데이터 변경을 방지하려면 상수 개체에 대한 포인터로 만들어야 합니다.

언급URL : https://stackoverflow.com/questions/219914/what-use-are-const-pointers-as-opposed-to-pointers-to-const-objects

반응형