상수 포인터 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의 차이를 더 잘 이해하려면 다음 링크를 참조하십시오.
const int* ptr;여기서 *ptr은 일정하고 *ptr은 다시 변경할 수 없다고 생각한다.
int * const ptr;여기서 ptr을 상수로 생각하고, 그것은 다시 바뀔 수 없다.
언급URL : https://stackoverflow.com/questions/21476869/constant-pointer-vs-pointer-to-constant
'source' 카테고리의 다른 글
| Java에서 문자열이 정수인지 확인 (0) | 2022.08.10 |
|---|---|
| vuex.disc 글로벌오류 핸들러 상태 (0) | 2022.08.10 |
| 표면과 텍스처의 차이(SDL/일반) (0) | 2022.08.10 |
| Vuejs의 window.scrollY 변경 내용을 확인합니다. (0) | 2022.08.10 |
| JDBC에서 postgres에 접속할 때 스키마를 지정할 수 있습니까? (0) | 2022.08.10 |