source

상수 포인터 vs 상수 포인터

goodcode 2022. 8. 10. 22:18
반응형

상수 포인터 vs 상수 포인터

다른 점을 알고 싶다

const int* ptr;

그리고.

int * const ptr; 

어떻게 작동하는지도요.

나는 이것을 이해하거나 계속 기억하는 것이 꽤 어렵다.제발 도와주세요.

const int* ptr; 

ptrconst intptr이지만, 「」가 , 「」가 가리키는 오브젝트.ptr수정할 수 없습니다.

const int a = 10;
const int* ptr = &a;  
*ptr = 5; // wrong
ptr++;    // right  

하는 동안에

int * const ptr;  

ptr a const를 지정합니다.int을 수정할 수 . 수정할 수 없습니다.ptr, 이 는 이 오브젝트를 가리키고 .ptr변경할 수 있습니다.

int a = 10;
int *const ptr = &a;  
*ptr = 5; // right
ptr++;    // wrong

일반적으로 다음과 같은 선언문을 읽고 이해하기 쉽게 하는 것이 좋습니다(오른쪽에서 왼쪽으로 읽음).

int const  *ptr; // ptr is a pointer to constant int 
int *const ptr;  // ptr is a constant pointer to int
const int * ptr;

포인터 데이터는 일정하고 불변하지만 포인터는 일정하지 않음을 의미합니다.

int * const ptr;

포인터는 일정하고 불변하지만 포인팅된 데이터는 일정하지 않음을 의미합니다.

참조하다

상수 포인터

먼저 상수 포인터가 무엇인지 알아보겠습니다.상수 포인터는 주소를 변경할 수 없는 포인터입니다.즉, 상수 포인터가 변수를 가리키면 다른 변수를 가리킬 수 없다고 할 수 있습니다.

는 다음과됩니다.
<type of pointer> * const <name of pointer>

int * const ptr;
포인터를 설명하기 .

#include<stdio.h>

int main(void)
{
    int var1 = 0, var2 = 0;
    int *const ptr = &var1;
    ptr = &var2;
    printf("%d\n", *ptr);

    return 0;
} 

위의 예에서는 다음과 같습니다.

  • var1과 의 var1과 var2의 var2를 했습니다.
  • 포인터 '되었습니다.
  • ptr를 사용하다
  • ptr을 사용하다

상수 포인터

이름에서 알 수 있듯이, 가리키는 변수의 값을 변경할 수 없는 포인터를 상수 포인터라고 합니다.이러한 유형의 포인터는 포인터가 가리키는 주소를 변경할 수 있지만 해당 주소에 유지되는 값은 변경할 수 없습니다.

과 같이됩니다.const <type of pointer>* <name of pointer>const int* ptr; 하기 위해 작은 합니다.

 #include<stdio.h>

int main(void)
{
    int var1 = 0;
    const int* ptr = &var1;
    *ptr = 1;
    printf("%d\n", *ptr);

    return 0;
} 

위의 코드:

  • 값이 0인 변수 var1을 정의했습니다.
  • 변수 var1을 가리키는 상수에 대한 포인터를 정의했다.
  • 이 포인터를 통해 var1의 값을 변경하려고 했습니다.
  • printf를 사용하여 새 값을 인쇄.
const int* ptr;

는 상수(내용)에 대한 포인터입니다.할 수 포인터 수정).ptr = NULL,ptr++단, 내용은 변경할 수 없습니다.

int * const ptr;

상수 포인터입니다.그 반대도 가능합니다.포인터는 수정할 수 없지만 포인터가 가리키는 포인터는 수정할 수 있습니다. *ptr += 5.

int i;
int j;

int * const ptr1 = &i;

됩니다.ptr1.

const int * ptr2 = &i;

됩니다.*ptr2.

ptr1 = &j; // error
*ptr1 = 7; // ok

ptr2 = &j; // ok
*ptr2 = 7; // error

수 요.*ptr2 ""를 를 입력합니다.*ptr2:

i = 4;
printf("before: %d\n", *ptr2); // prints 4
i = 5;
printf("after: %d\n", *ptr2); // prints 5
*ptr2 = 6; // still an error

다음 두 가지 기능을 모두 갖춘 포인터를 사용할 수도 있습니다.

const int * const ptr3 = &i;

ptr3 = &j; // error
*ptr3 = 7; // error

1) 상수 포인터 : 이러한 유형의 포인터는 가리키는 주소를 변경할 수 없습니다.즉, 변수를 가리키거나 해당 변수의 주소를 저장하는 포인터가 있다고 가정합니다.포인터를 다른 변수를 가리키려고 하면(또는 다른 변수의 포인터 스토어 주소를 작성하려고 하면), 상수 포인터는 이를 수행할 수 없습니다.

는 다음과 같이 됩니다.int *const ptr로서 'const')로 만든다).

2) [Pointer to Constant] : 이러한 유형의 포인터는 가리키는 값을 변경할 수 없습니다.즉, 주소가 있는 변수의 값은 변경할 수 없습니다.

같이 됩니다.const int *ptr('const'는 계속합니다.

상수 포인터

#include<stdio.h>

int main(void)
{
    int a[] = {10,11};
    int* const ptr = a;

    *ptr = 11;

    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    ptr++;
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    return 0;
}

위의 코드를 컴파일하면 컴파일러가 불만을 제기합니다.

practice # gcc -Wall constant_pointer.c -o constant_pointer
constant_pointer.c: In function ‘main’:
constant_pointer.c:13: error: increment of read-only variable ‘ptr’

따라서 컴파일러가 일정한 포인터에 의해 유지되는 주소를 변경할 수 없다고 불평하는 것을 위에서 명확하게 알 수 있습니다.

상수에 대한 포인터

#include<stdio.h>

int main(void)
{
    int a = 10;
    const int* ptr = &a;


    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    *ptr = 11;

    return 0;
}

위의 코드가 컴파일되면 컴파일러는 다음과 같이 불만을 제기합니다.

practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant
pointer_to_constant.c: In function ‘main’:
pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’

따라서 여기서도 컴파일러는 포인터가 포인팅되는 변수의 값을 변경하는 것을 허용하지 않는 것을 알 수 있습니다.

견적서

상수 값에서 Const 포인터와 Pointer의 차이를 더 잘 이해하려면 다음 링크를 참조하십시오.

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

const int* ptr;여기서 *ptr은 일정하고 *ptr은 다시 변경할 수 없다고 생각한다.

int * const ptr;여기서 ptr을 상수로 생각하고, 그것은 다시 바뀔 수 없다.

언급URL : https://stackoverflow.com/questions/21476869/constant-pointer-vs-pointer-to-constant

반응형