(정규 객체에 대한 포인터와 반대로) 정칙 포인터는 어떤 용도로 사용됩니까?
물체를 고정시키기 위해 자주 포인터를 사용했어요, 예를 들면...
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 at
C에서 가장 관용적인 방법은 상수 포인터를 선언하는 것입니다.그러한 용도는 또한 다음과 같은 것을 가져야 합니다.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
'it-source' 카테고리의 다른 글
Mysql cut string, 첫번째 캐릭터? (0) | 2023.10.13 |
---|---|
MySQL에서 <> 연산자와 != 연산자의 차이점은 무엇입니까? (0) | 2023.10.13 |
워드프레스 - 특정메뉴에 대한 wp_nav_메뉴 맞춤형 (0) | 2023.10.13 |
PowerShell 시도/잡기/마침내 (0) | 2023.10.13 |
PowerShell의 xargs와 동등한 수준은 얼마입니까? (0) | 2023.10.13 |