상수 포인터 vs 상수 값에서의 포인터
다음 선언의 차이점은 무엇입니까?
char * const a;
const char * a;
차이를 이해하기 위해 이 작은 프로그램을 작성했습니다.
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char a = 'x';
char b = 'y';
char * const pc1 = &a;
const char * pc2 = &a;
printf ("Before\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", *pc1);
printf ("pc2=%p\n", pc2);
printf ("*pc2=%c\n", *pc2);
*pc1 = b;
/* pc1 = &b; */
/* *pc2 = b; */
pc2 = &b;
printf ("\n\n");
printf ("After\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", *pc1);
printf ("pc2=%p\n", pc2);
printf ("*pc2=%c\n", *pc2);
return EXIT_SUCCESS;
}
프로그램을 컴파일(gcc 3.4)하여 실행하였습니다.출력은 그 차이를 잘 나타내고 있습니다.
Before
pc1=ffbfd7e7
*pc1=x
pc2=ffbfd7e7
*pc2=x
After
pc1=ffbfd7e7
*pc1=y
pc2=ffbfd7e6
*pc2=x
하지만 나는 답을 얻기 위해 작은 프로그램을 작성해야만 했다.(인터뷰 등) 기계에서 떨어져 있는 경우에는 질문에 대답할 수 없습니다.
예를 어떻게 좋을지 설명해 .const
워드드? 츠요시
복잡한 유형을 구문 분석하려면 변수에서 시작하여 왼쪽으로 이동하고 나선형으로 이동합니다.(변수명의 오른쪽에 배치되어 있기 때문에) 걱정할 어레이나 함수가 없는 경우는 오른쪽에서 왼쪽으로 읽습니다.
★★★★★★★★★★★★★★★.char *const a;
있다a
,, 즉 즉, 즉, 즉, 즉, 즉,const
포인터())*
에 접속합니다.char
, 이 수 a
를 가리키고 이 부분은 수 .a
하다
로 ★★★★★★★★★const char* b;
있다b
*
에 접속합니다.char
, 「」입니다.const
해서 수 있어요.b
, 할 수 .*b = ...;
.
섭취할 수 .const char *const c;
.
char * const a;
포인터는 일정하고 불변하지만 포인팅된 데이터는 일정하지 않음을 의미합니다.
하면 .const_cast
(C++의 경우) 또는 c-스타일 캐스트를 사용하여 데이터 자체가 일정하지 않기 때문에 이 경우 항상성을 버립니다.
const char * a;
포인터 a를 사용하여 포인터 데이터를 쓸 수 없음을 의미합니다.「」의 const_cast
(C++) 또는 c-style cast를 사용하여 이 경우 항상성을 버립니다.
제제 의 차이를 알게 되었습니다.char * const a
★★★★★★★★★★★★★★★★★」const char * a
변수에 포인터인지 . 상수 포인터인지 상수 변수에 대한 포인터인지 헷갈리는 경우가 많습니다.
읽는 법?아래 간단한 단계에 따라 위의 두 단계를 식별하십시오.
아래 선언을 읽는 방법을 살펴봅시다.
char * const a;
오른쪽에서 왼쪽으로 읽다
저부터 합시다.a
,
에 인접하다.a
const
* 자 **(const a)
---> 래 --a
는 입니다.constant
(????)
2가 됩니다.*
차(* (const a))
---> 래 --a
는 입니다.constant
pointer
로로 합니다.(????)
.
3개 요. 따가가보char
(char (* (const a)))
--->a
는 입니다.constant
pointer
로로 합니다.character
a is constant pointer to character variable.
쉽게 읽을 수 있지 않나요?
마찬가지로 두 번째 선언도 마찬가지입니다.
const char * a;
이제 다시 시작합시다a
,
한 1.a
*
---> 래 --a
는 입니다.pointer
(--?(----?) )?)?) 。
2. 2재재재는 2 2char
--->그래서a
pointer
character
,
★★★★★★★★★★★★★!! ★★★★★★★★★★★★★★★★★★★pointer
★★★★★★★★★★★★★★★★★」character
--->그래서a
character
pointer
로로 합니다.(?????)
3. 요. 이것으로constant
--->그래서a
character
pointer
로로 합니다.constant
하지만 선언이 무엇을 의미하는지 알 수 있지만, 좀 더 합리적으로 들립시다.
a is pointer to constant character variable
char * const a;
*a
하지만, 「 」a
즉, 에 의해 지정된 값을 변경할 수 있습니다.a
, 수정은 할 수 a
그 자체입니다. a
는 에 대한 상수 포인터입니다.
const char * a;
a
하지만, 「 」*a
않습니다 수정이 합니다.a
(새 위치에 추가) 단, 에 의해 지정된 값은 변경할 수 없습니다.a
이것은, 다음과 같은 점에 주의해 주세요.
char const * a;
「」는,a
는 에 대한 포인터입니다.
차이를 이해하는 가장 쉬운 방법은 다른 가능성을 생각하는 것입니다.고려해야 할 오브젝트는 포인터와 가리키는 오브젝트 두 가지가 있습니다(이 경우 'a'는 포인터의 이름이고, 가리키는 오브젝트는 이름이 없는 char 타입입니다).생각할 수 있는 것은 다음과 같습니다.
- 변하지 않는 것은 없다
- 포인터가 일정합니다.
- 가리키는 물체는 const입니다.
- 포인터와 가리키는 오브젝트가 모두 일정합니다.
이러한 다양한 가능성은 다음과 같이 C로 나타낼 수 있습니다.
- char * a;
- char * const a;
- const char * a;
- const char * const a;
나는 이것이 가능한 차이점을 보여주길 바란다.
첫 번째는 문자에 대한 상수 포인터이고 두 번째는 문자에 대한 상수 포인터입니다.코드의 모든 케이스를 건드리지 않았습니다.
char * const pc1 = &a; /* You can't make pc1 point to anything else */
const char * pc2 = &a; /* You can't dereference pc2 to write. */
*pc1 = 'c' /* Legal. */
*pc2 = 'c' /* Illegal. */
pc1 = &b; /* Illegal, pc1 is a constant pointer. */
pc2 = &b; /* Legal, pc2 itself is not constant. */
먼저 구두로 설명하고 다음으로 예를 들어 설명하겠습니다.
포인터 객체는 const 포인터 또는 const 객체에 대한 포인터(또는 둘 다)로 선언할 수 있습니다.
Const 포인터는 처음 할당된 개체와 다른 개체를 가리키도록 재할당할 수 없지만 가리키는 개체('포인트'라고 함)를 수정하는 데 사용할 수 있습니다.
따라서 참조 변수는 순시자의 대체 구문입니다.
한편 const 객체에 대한 포인터는 동일한 유형 또는 변환 가능한 유형의 다른 객체를 가리키도록 재할당할 수 있지만 객체를 수정하는 데 사용할 수 없습니다.
const 객체에 대한 const 포인터도 선언할 수 있으며 포인터의 변경이나 다른 객체를 가리키도록 재할당할 수 없습니다.
예:
void Foo( int * ptr,
int const * ptrToConst,
int * const constPtr,
int const * const constPtrToConst )
{
*ptr = 0; // OK: modifies the "pointee" data
ptr = 0; // OK: modifies the pointer
*ptrToConst = 0; // Error! Cannot modify the "pointee" data
ptrToConst = 0; // OK: modifies the pointer
*constPtr = 0; // OK: modifies the "pointee" data
constPtr = 0; // Error! Cannot modify the pointer
*constPtrToConst = 0; // Error! Cannot modify the "pointee" data
constPtrToConst = 0; // Error! Cannot modify the pointer
}
기꺼이 도와드리죠!행운을 빕니다.
cdecl 유틸리티 또는 https://cdecl.org/ 등의 온라인 버전을 사용할 수 있습니다.
예를 들어 다음과 같습니다.
void (* x)(int (*[])());
는 입니다.declare x as pointer to function (array of pointer to function returning int) returning void
다음은 훌륭한 답변입니다.이를 기억하기 위한 간단한 방법은 다음과 같습니다.
는 포인터입니다.
*a는 값입니다.
const a라고 하면 포인터는 const입니다.(예: char * const a;)
"const *a"라고 하면 값은 const입니다.(예: const char * a;)
간단한 답변을 시도합니다.
char * const a; => a is (const) constant (*) pointer of type char {L <- R}. =>( Constant Pointer )
const char * a; => a is (*) pointer to char constant {L <- R}. =>( Pointer to Constant)
상수 포인터:
포인터는 일정합니다!!즉, 보관하고 있는 주소는 변경할 수 없습니다.읽기 전용 메모리에 저장됩니다.
자세한 내용을 알기 위해 포인터 주소를 변경해 보겠습니다.
char * const a = &b;
char c;
a = &c; // illegal , you can't change the address. `a` is const at L-value, so can't change. `a` is read-only variable.
그것은 한번 일정한 포인터가 어떤 것을 가리킨다는 것을 의미한다.
a
만 '''''b
.
이 값은 수 요.b
삭제:
char b='a';
char * const a =&b;
printf("\n print a : [%c]\n",*a);
*a = 'c';
printf("\n now print a : [%c]\n",*a);
상수 포인터:
포인터가 가리키는 값은 변경할 수 없습니다.
const char *a;
char b = 'b';
const char * a =&b;
char c;
a=&c; //legal
*a = 'c'; // illegal , *a is pointer to constant can't change!.
const char * a;
이것은 상수 문자에 대한 포인터입니다.예를 들면.
char b='s';
const char *a = &b;
서 ★★★★a
이 경우 상수 문자를 가리킵니다.) 하면 안 요.a
이 값을 변경합니다.하지만 이 선언은 그것이 가리키는 값이 정말 상수라는 것을 의미하는 것이 아니라, 단지 그 값이 상수라는 것을 의미한다.a
염려하고 있습니다. 값은 수 .b
b
a
포인터
*a='t'; //INVALID b='t' ; //VALID
char * const a=&b
문자a
b
'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 하다의 값을 바꿀 수 있습니다.b
.
도움이 되었으면 좋겠어!!!:)
언급URL : https://stackoverflow.com/questions/10091825/constant-pointer-vs-pointer-on-a-constant-value
'itsource' 카테고리의 다른 글
다른 ID로 여러 행을 동시에 업데이트 (0) | 2023.02.06 |
---|---|
Python 함수가 예외를 발생시키는 것을 어떻게 테스트합니까? (0) | 2023.02.06 |
PHP에서 동적 변수 이름에 중괄호 사용 (0) | 2023.02.06 |
PHP(라인 피드)에 파일에 새 줄 쓰기 (0) | 2023.02.06 |
문자열 표현을 사용하지 않고 설정된 표준 시간대로 날짜 만들기 (0) | 2023.02.06 |