itsource

상수 포인터 vs 상수 값에서의 포인터

mycopycode 2023. 2. 6. 23:31
반응형

상수 포인터 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 ,

에 인접하다.aconst

* 자 **(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

--->그래서apointer character,

★★★★★★★★★★★★★!! ★★★★★★★★★★★★★★★★★★★pointer ★★★★★★★★★★★★★★★★★」character

--->그래서acharacter pointer로로 합니다.(?????)

3. 요. 이것으로constant

--->그래서acharacter 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 타입입니다).생각할 수 있는 것은 다음과 같습니다.

  1. 변하지 않는 것은 없다
  2. 포인터가 일정합니다.
  3. 가리키는 물체는 const입니다.
  4. 포인터와 가리키는 오브젝트가 모두 일정합니다.

이러한 다양한 가능성은 다음과 같이 C로 나타낼 수 있습니다.

  1. char * a;
  2. char * const a;
  3. const char * a;
  4. 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 ba포인터

*a='t'; //INVALID b='t' ; //VALID

char * const a=&b

문자ab '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 하다의 값을 바꿀 수 있습니다.b.

도움이 되었으면 좋겠어!!!:)

언급URL : https://stackoverflow.com/questions/10091825/constant-pointer-vs-pointer-on-a-constant-value

반응형