차이점은 무엇입니까?
char * const
과
const char *
차이점은 무엇입니까?
char * const
과
const char *
답변:
차이점은에 const char *
대한 포인터 const char
이고, char * const
에 대한 상수 포인터 char
입니다.
첫 번째로 가리키는 값은 변경할 수 없지만 포인터는 변경할 수 있습니다. 두 번째, 가리키는 값은 변경 될 수 있지만 포인터는 참조와 유사하지 않습니다.
또 한있다
const char * const
상수 char에 대한 상수 포인터입니다 (따라서 변경할 수는 없습니다).
노트 :
다음 두 가지 형태가 동일합니다.
const char *
과
char const *
정확한 이유는 C ++ 표준에 설명되어 있지만 혼동을 피하고 피하는 것이 중요합니다. 선호하는 몇 가지 코딩 표준을 알고 있습니다.
char const
위에
const char
(포인터가 있거나없는) const
요소 의 배치 는 pointer와 동일 const
합니다.
const int *foo,*bar;
모두를 선언 할 foo
및 bar
수 int const *
있지만 int const *foo, *bar
선언 할 foo
가 될 int const *
및 bar
수 int *
. typedef int * intptr; const intptr foo,bar;
두 변수를 모두 선언 한다고 생각 합니다 int * const
. typedef없이 결합 된 선언을 사용하여 해당 유형의 두 변수를 만드는 방법을 모르겠습니다.
I believe const int *foo,*bar; would declare both foo and bar to be int const *
: 예. but int const *foo, *bar would declare foo to be a int const * and bar to be int *
: 안돼! 이전 사례와 정확히 동일합니다. ( foo와 bar에서 동일한 오류가 발생하는 ideone.com/RsaB7n을 참조하십시오 ). I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const
: 예. I don't know any way to use a combined declaration to create two variables of that type without a typedef
: 글쎄 int *const foo, *const bar;
. C 선언자 구문 ...
int const *foo, *volatile bar
해야 bar
합니까? 둘 다 const
만들고 volatile
? 나는 선언 된 변수 이름과 그 유형의 Pascal의 깔끔한 분리를 그리워합니다 (정수에 대한 포인터 배열에 대한 포인터는 var foo: ^Array[3..4] of ^Integer
;`일 것입니다.). C에서 중첩 된 괄호로 묶인 것입니다.
int const *foo, *volatile bar
"에서 형식 부분은 int const
(앞에 멈춤 *
)이고 선언자는 *foo
(표현식 *foo
은을 나타냄 int const
) 및 *volatile bar
; 읽기 오른쪽에서 왼쪽으로 (좋은 규칙 CV-한정자 ), foo
A와 포인터입니다 CONST의 INT, 그리고 bar
A는 휘발성 A와 포인터 CONST의 INT (그 자체가 휘발성 포인터, 뾰족한 INT는 const를 [로 액세스]입니다).
[3..4]
구문 에 대해 확실하지 않으므로 10 요소의 배열을 보자) : int *(*foo)[10];
. 그것은 (미래의) 사용을 표현으로 반영합니다 : *(*foo)[i]
( 즉 i
, 범위의 정수로 )는 먼저 배열을 가져 오기 위해 역 참조 한 다음 색인에서 요소에 액세스합니다 (postfix 가 prefix보다 꽉 묶기 때문에 ). 수율 ( ideone.com/jgjIjR 참조 ). 그러나 더 쉽게 만듭니다 ( ideone.com/O3wb7d 참조 ). [0, 10)
[0, 9]
foo
i
[]
*
int
typedef
혼동을 피하려면 항상 const 한정자를 추가 하십시오.
int * mutable_pointer_to_mutable_int;
int const * mutable_pointer_to_constant_int;
int *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;
p
유형과 관련이 없습니다 (const int *const)
. C와 C ++에서 const 한정자는 더 나은지 나쁜지 (나에게 물어 보면 더 나쁘다) postfix : cf const member function void foo(int a) const;
입니다. 선언 가능성 const int
은 규칙이 아닌 예외입니다.
const
형식 선언에서 첫 번째 일 때를 제외하고 그 앞 (왼쪽)에 오는 것을 항상 수정하고, 그 뒤에 오는 것을 수정합니다 (오른쪽에).
따라서이 두 가지는 동일합니다.
int const *i1;
const int *i2;
그들은에 대한 포인터를 정의합니다 const int
. 위치 i1
와 i2
지점을 변경할 수 있지만 해당 지점의 값을 변경할 수는 없습니다.
이:
int *const i3 = (int*) 0x12345678;
const
정수에 대한 포인터를 정의하고 메모리 위치 12345678을 가리 키도록 초기화합니다 int
. 주소 12345678 의 값을 변경할 수 있지만 i3
가리키는 주소는 변경할 수 없습니다 .
const * char
유효하지 않은 C 코드이며 의미가 없습니다. 아마도 당신은 a const char *
와 a char const *
의 차이 또는 a 와 a 의 차이를 물어 보려고했습니다 const char *
.char * const
?
경험 법칙 : 정의를 오른쪽에서 왼쪽으로 읽으십시오!
const int *foo;
" foo
포인트 ( *
)는 int
변경할 수없는 ( const
)"을 의미합니다.
프로그래머에게 이것은 " 이것이 가리키는 것의 가치 를 바꾸지 않을 것"을 의미 foo
합니다.
*foo = 123;
또는 foo[0] = 123;
유효하지 않습니다.foo = &bar;
허용됩니다.int *const foo;
" foo
는 ( const
) 및 ( *
)를 int
"로 변경할 수 없음을 의미 합니다.
프로그래머에게 이것은 " 참조 하는 메모리 주소 를 변경하지 않겠다 foo
"는 의미입니다.
*foo = 123;
또는 foo[0] = 123;
허용됩니다.foo = &bar;
유효하지 않습니다.const int *const foo;
수단 "은 foo
변경할 수 없습니다 ( const
)과 점 ( *
)는에 int
그 수없는 변화 ( const
)".
프로그래머에게 이것은 " 포인팅 한 값 을 foo
변경하지 않으며 참조 하는 주소 를 변경하지 않을 것 foo
" 을 의미합니다.
*foo = 123;
또는 foo[0] = 123;
유효하지 않습니다.foo = &bar;
유효하지 않습니다.const char * x 여기서 X는 기본적으로 상수 값을 가리키는 문자 포인터입니다.
char * const x 는 상수 인 문자 포인터를 나타내지 만, 가리키는 위치는 변경 될 수 있습니다.
const char * const x 는 1과 2의 조합으로 상수 값을 가리키는 상수 문자 포인터임을 의미합니다.
const * char x 는 컴파일러 오류를 일으 킵니다. 선언 할 수 없습니다.
char const * x 는 포인트 1과 같습니다.
일반적으로 const 가 var name 인 경우 포인터는 일정하지만 포인팅 위치는 변경할 수 있습니다 . 그렇지 않으면 포인터는 일정한 위치를 가리키고 포인터는 다른 위치를 가리킬 수 있지만 포인팅 위치 내용은 변경할 수 없습니다 .
많은 답변은 특정 변수 선언의 특정 인스턴스를 이해하기 위해 특정 기술, 경험 규칙 등을 제공합니다. 그러나 선언을 이해하는 일반적인 기술이 있습니다.
시계 방향 / 나선 규칙
ㅏ)
const char *a;
시계 방향 / 나선형 규칙에 따라 a
일정한 문자를 가리키는 포인터입니다. 이것은 문자가 일정하지만 포인터가 변경 될 수 있음을 의미합니다. 즉 a = "other string";
괜찮지 만a[2] = 'c';
컴파일에 실패합니다
비)
char * const a;
규칙 a
에 따라 문자에 대한 const 포인터입니다. 즉 할 수는 a[2] = 'c';
있지만 할 수는 없습니다a = "other string";
다음은 코드에 대한 자세한 설명입니다
/*const char * p;
char * const p;
const char * const p;*/ // these are the three conditions,
// const char *p;const char * const p; pointer value cannot be changed
// char * const p; pointer address cannot be changed
// const char * const p; both cannot be changed.
#include<stdio.h>
/*int main()
{
const char * p; // value cannot be changed
char z;
//*p = 'c'; // this will not work
p = &z;
printf(" %c\n",*p);
return 0;
}*/
/*int main()
{
char * const p; // address cannot be changed
char z;
*p = 'c';
//p = &z; // this will not work
printf(" %c\n",*p);
return 0;
}*/
/*int main()
{
const char * const p; // both address and value cannot be changed
char z;
*p = 'c'; // this will not work
p = &z; // this will not work
printf(" %c\n",*p);
return 0;
}*/
// Some more complex constant variable/pointer declaration.
// Observing cases when we get error and warning would help
// understanding it better.
int main(void)
{
char ca1[10]= "aaaa"; // char array 1
char ca2[10]= "bbbb"; // char array 2
char *pca1= ca1;
char *pca2= ca2;
char const *ccs= pca1;
char * const csc= pca2;
ccs[1]='m'; // Bad - error: assignment of read-only location ‘*(ccs + 1u)’
ccs= csc; // Good
csc[1]='n'; // Good
csc= ccs; // Bad - error: assignment of read-only variable ‘csc’
char const **ccss= &ccs; // Good
char const **ccss1= &csc; // Bad - warning: initialization from incompatible pointer type
char * const *cscs= &csc; // Good
char * const *cscs1= &ccs; // Bad - warning: initialization from incompatible pointer type
char ** const cssc= &pca1; // Good
char ** const cssc1= &ccs; // Bad - warning: initialization from incompatible pointer type
char ** const cssc2= &csc; // Bad - warning: initialization discards ‘const’
// qualifier from pointer target type
*ccss[1]= 'x'; // Bad - error: assignment of read-only location ‘**(ccss + 8u)’
*ccss= ccs; // Good
*ccss= csc; // Good
ccss= ccss1; // Good
ccss= cscs; // Bad - warning: assignment from incompatible pointer type
*cscs[1]= 'y'; // Good
*cscs= ccs; // Bad - error: assignment of read-only location ‘*cscs’
*cscs= csc; // Bad - error: assignment of read-only location ‘*cscs’
cscs= cscs1; // Good
cscs= cssc; // Good
*cssc[1]= 'z'; // Good
*cssc= ccs; // Bad - warning: assignment discards ‘const’
// qualifier from pointer target type
*cssc= csc; // Good
*cssc= pca2; // Good
cssc= ccss; // Bad - error: assignment of read-only variable ‘cssc’
cssc= cscs; // Bad - error: assignment of read-only variable ‘cssc’
cssc= cssc1; // Bad - error: assignment of read-only variable ‘cssc’
}
통사론:
datatype *const var;
char *const
이 경우에 온다.
/*program to illustrate the behaviour of constant pointer */
#include<stdio.h>
int main(){
int a=10;
int *const ptr=&a;
*ptr=100;/* we can change the value of object but we cannot point it to another variable.suppose another variable int b=20; and ptr=&b; gives you error*/
printf("%d",*ptr);
return 0;
}
통사론:
const datatype *var
또는 datatype const *var
const char*
이 경우에 온다.
/* program to illustrate the behavior of pointer to a constant*/
#include<stdio.h>
int main(){
int a=10,b=20;
int const *ptr=&a;
printf("%d\n",*ptr);
/* *ptr=100 is not possible i.e we cannot change the value of the object pointed by the pointer*/
ptr=&b;
printf("%d",*ptr);
/*we can point it to another object*/
return 0;
}
그만큼 const
개질제는 바로 왼쪽 용어에 적용된다. 이것에 대한 유일한 예외는 왼쪽에 아무것도 없을 때 오른쪽에있는 것에 적용됩니다.
다음은 "상수에 대한 상수 포인터"라고 말하는 것과 동등한 방법입니다 char
.
const char * const
const char const *
char const * const
char const const *
int const *
(또는 const int *
) 사용은 const int
변수를 가리키는 포인터에 관한 것이 아니라이 변수 라는 것을 지적하고 싶습니다.const
가이 특정 포인터를위한 .
예를 들면 다음과 같습니다.
int var = 10;
int const * _p = &var;
위의 코드는 완벽하게 컴파일됩니다. 상수는 아니지만 변수를 _p
가리 킵니다 .const
var