2014-10-02 5 views
0

나는 항상 const 포인터를 혼동합니다. 는 사람이 권하는하려고 다음 의 코드 그들이 무슨 말을하는지 알고 있지만 내가 단순 way.Thanksconst 한정자와 Const 포인터

사실
char *p="Hello";     /*pointer is variable,so string is*/ 
    *p='M'; 
    p="BYE";  /*works*/ 
    p="Bye";  /*works*/ 

    const char *q="Hello";   /*string is constant pointer is not */ 
    *q='M';  /*Error*/ 
    q="BYE";  /*works*/ 

    char const *s="Hello";   /*string is constant pointer is not */ 
    *s='M';  /*Error*/ 
    s="BYE"; /*works*/ 

    char* const t="Hello";   /*pointer is constant string is not */ 
    *t='M';  /*works*/ 
    t="BYE"; /*error*/ 

    const char* const u="Hello"; /*string is constant,so is pointer*/ 
    *u='M'; /*error*/ 
    u="BYE"; /*error*/ 
+0

[이 답변에 포함 된] 차트 (http://stackoverflow.com/a/14566215/1322972)는 자신을 만족스럽게 생각하지 않으려 고합니다. 구조에 대한 괜찮은 비난과 단방향 및 이중 간접 포인터 다양한 위치에서. 그리고 타입 선언에 대해 자주 (또는 가끔) 질문이 있으면 북 마킹 할 가치가있는 [** cdecl.org **] (http://cdecl.org)가 항상 있습니다. – WhozCraig

+0

문자열 리터럴은 주소가 할당 된 포인터의 종류에 따라 다르게 해석된다고 생각하는 것 같습니다. 그렇지 않다. 문자열 리터럴 * 항상 *는'char *'유형 값이되지만 * 여전히 문자를 변경할 수는 없습니다 *. – unwind

답변

0

이 세 가지 코드에 이유가 필요합니까 어떤 간단한 방법으로 나를 설명 할 수

char *p="Hello";     /*pointer is variable,so string is*/ 
    *p='M'; 
    p="BYE";  /*works*/ 
    p="Bye";  /*works*/ 

    const char *q="Hello";   /*string is constant pointer is not */ 
    *q='M';  /*Error*/ 
    q="BYE";  /*works*/ 

    char const *s="Hello";   /*string is constant pointer is not */ 
    *s='M';  /*Error*/ 
    s="BYE"; /*works*/ 

은 포인터가 가리키는 객체를 변경할 수 없다는 의미에서 동일합니다. 차이점은 한정자 const를 q 정의에 추가하면 컴파일러가 컴파일 타임에 오류를 찾을 수 있다는 것입니다.

문자열 리터럴을 수정할 수 없습니다. 문자열 리터럴을 수정하려고하면 프로그램의 정의되지 않은 동작이 발생합니다. C 문자열 리터럴에는 비 const 문자 배열 형식이 있습니다. 그러나 두 번째 코드 스 니펫 에서처럼 한정자 const를 추가하면 컴파일러는 컴파일 타임에 오류를 찾을 수 있습니다. 이들 어레이가 요소가 적절한 값을 제공하는지 구별

표준 C (6.4.5 문자열 리터럴)

7이 지정된다. 프로그램이 배열을 수정하려고하면 동작이 정의되지 않습니다. 양 상수 오브젝트 포인터를 정의 미적

char const * 

const char * 

레코드 사이

제외하고 차이가 없어

. 포인터 자체는 일정하지 않습니다.

그러나 당신은 당신이 문자 배열을 변경할 수 있기 때문에 또는 const를 규정하지 않고 포인터를 사용하는 사이에 차이가 다음과 같은 방법

char s[] ="Hello";     /*pointer is variable,so string is*/ 
char *p = s; 
const char *q = s; 
*p='M'; 
*q='M'; 

을 작성합니다. 마지막 명령문의 경우 컴파일러는 오류를 발생시킵니다.

마지막 두 코드 단편은 포인터의 값인 마지막 두 정의 상수 포인터가 변경되지 않을 수 있다는 점에서 첫 번째 코드 단편과 다릅니다. 그런 다음 컴파일러에서 오류를 발생시키는 상수 포인터를 다시 할당하려고합니다. 상수 객체는 정의 될 때 초기화되어야한다.