C와 C++에서 const pointer-to-point는 무엇을 의미합니까?
저는 선언문을 오른쪽에서 왼쪽으로 읽는 습관을 알고 있으며 동료가 제게 다음과 같이 말하기 전까지는 무슨 일이 일어나고 있는지 알고 있다고 꽤 확신했습니다.
const MyStructure** ppMyStruct;
즉, "ppMyStruct는 (변동 가능한) MyStructure에 대한 const 포인터입니다"(C++).
나는 그것이 "ppMyStruct는 constMyStructure에 대한 포인터"를 의미한다고 생각했을 것입니다.C++ 스펙에서 답을 찾았지만, 제가 그걸 잘 못 하는 것 같아요...
C++에서 는 무엇을 의미하며, C에서도 같은 것을 의미합니까?
당신의 동료는 틀렸습니다.이것은 const MyStructure에 대한 (비정규) 포인터입니다.C와 C++ 모두에서.
이러한 경우 도구 cdecl(또는 c++decl)이 유용할 수 있습니다.
[flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct"
declare ppMyStruct as pointer to pointer to const struct s
당신의 해석이 옳았습니다.여기 다른 관점이 있습니다.
const MyStructure * *ppMyStruct; // ptr --> ptr --> const MyStructure
MyStructure *const *ppMyStruct; // ptr --> const ptr --> MyStructure
MyStructure * *const ppMyStruct; // const ptr --> ptr --> MyStructure
이것들은 모두 하나의 상수 한정자를 가진 포인터 대 포인터의 대안입니다.오른쪽에서 왼쪽으로 규칙을 사용하여 선언을 해독할 수 있습니다(적어도 C++에서는 C 전문가가 아닙니다).
당신의 동료는 틀렸고, 그것은 C와 C++도 마찬가지입니다.다음을 시도합니다.
typedef struct foo_t {
int i;
} foo_t;
int main()
{
foo_t f = {123};
const foo_t *p = &f;
const foo_t **pp = &p;
printf("f.i = %d\n", (*pp)->i);
(*pp)->i = 888; // error
p->i = 999; // error
}
Visual C++ 2008은 마지막 두 줄에 대해 다음 오류를 표시합니다.
error C2166: l-value specifies const object
error C2166: l-value specifies const object
GCC 4는 다음과 같이 말합니다.
error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'
G++ 4는 말합니다.
error: assignment of data-member 'foo_t::i' in read-only structure
error: assignment of data-member 'foo_t::i' in read-only structure
네 말이 맞아요.
다른 답변은 이미 "시계방향 나선형 규칙"을 가리켰습니다.하지만 저는 그것이 매우 마음에 들었습니다 - 약간 정교하긴 하지만.
다른 댓글들에 대한 결과로, 'const'를 먼저 넣지 마세요.그것은 정말 유형 다음에 속합니다.그것은 즉시 의미를 명확히 했을 것입니다. 그냥 평소처럼 RTL을 읽으십시오.
MyStructure const** ppMyStruct;
void Foo( int * ptr,
int const * ptrToConst,
int * const constPtr,
int const * const constPtrToConst )
{
*ptr = 0; // OK: modifies the pointee
ptr = 0; // OK: modifies the pointer
*ptrToConst = 0; // Error! Cannot modify the pointee
ptrToConst = 0; // OK: modifies the pointer
*constPtr = 0; // OK: modifies the pointee
constPtr = 0; // Error! Cannot modify the pointer
*constPtrToConst = 0; // Error! Cannot modify the pointee
constPtrToConst = 0; // Error! Cannot modify the pointer
}
언급URL : https://stackoverflow.com/questions/336585/what-does-a-const-pointer-to-pointer-mean-in-c-and-in-c
'programing' 카테고리의 다른 글
Oracle: DDL 및 트랜잭션 롤백 (0) | 2023.06.15 |
---|---|
판다 고유 값 여러 열 (0) | 2023.06.15 |
프로젝트에 대한 종속성 그래프를 얻을 수 있는 방법이 있습니까? (0) | 2023.06.15 |
Firebase 3.x - 토큰/세션 만료 (0) | 2023.06.15 |
노드를 호스트하는 방법JS 프로젝트를 화력 기지로? (0) | 2023.06.15 |