[면접 문제] const와 지침

(1)const int *p;   int const *p2;
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main(){
    int a = 3;
    int b = 4;
    const int *p;
    p= &a;
    int const *p2;
    p2 = &b;
    //*p = 5; error: assignment of read-only location '* p'
    //*p2 = 5; error: assignment of read-only location '* p2'
    p = &b;
    printf("%d
",*p); // : , 。 }

*p = 5;
오류 보고: error: assignment of read-only location'*p'
*p2 = 5 ;
오류 보고: error: assignment of read-only location'*p2'
뜻은 매우 명확하다. *p*p2는 모두 상량으로 변경할 수 없다.바늘 p와 p2는 모두 변수로 임의의 주소를 가리킬 수 있다.p = &a; p = &c;다 괜찮아요.
(2)int *const p3
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main(){
    int a = 3;
    int b = 4;
    //int *const p3 error:uninitialized const 'p3'  , 
    int *const p3 = &a;
    //p3 = &b; error: assignment of read-only variable 'p3'
    *p3 = 8;
    printf("%d
",*p3); // : , 。 , 。 }

int *const p3;
오류 보고: error:uninitializedconst'p3'는 p3를 초기화하지 않았습니다.
p3 = &b;
오류 보고: error: assignment of read-only variable'p3'바늘 p3는 상수입니다. 바늘이 가리키는 주소를 변경할 수 없습니다.
*p3 = 8;
*p3은 변수입니다. 포인터 p3가 가리키는 값을 변경할 수 있습니다.
요약하면 알 수 있듯이 포인터 p3는 상수이며 포인터가 가리키는 주소를 변경할 수 없습니다. *p3은 변수입니다. 즉, 바늘이 가리키는 것은 변수입니다. 바늘 p3가 가리키는 값을 변경할 수 있습니다.
(3)const int *const p3
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main(){
    int a = 3;
    int b = 4;
    const int *const p3 = &a;
    //int *const p3 error:uninitialized const 'p3'
    //p3 = &b; error: assignment of read-only variable 'p3'
    //*p3 = 8; error: assignment of read-only location '*(const int*)p3'
    printf("%d
",*p3); }

int *const p3;
오류 보고: error:uninitializedconst'p3'는 p3를 초기화하지 않았습니다.
p3 = &b;
오류 보고: error: assignment of read-only variable'p3'바늘 p3는 상수입니다. 바늘이 가리키는 주소를 변경할 수 없습니다.
*p3 = 8;
오류 보고: error: assignment of read-only location'*(const int*)p'*p3는 상수입니다. 바늘 p3가 가리키는 값을 변경할 수 없습니다.
요약하면 알 수 있듯이 포인터 p3는 상수이며 포인터가 가리키는 주소를 변경할 수 없습니다. *p3은 상량입니다. 즉, 바늘이 가리키는 것은 상량입니다. 바늘 p3가 가리키는 값을 변경할 수 없습니다.
요약:
int* p = 4; //non-const pointer,non-constdata
const char* p = &p; //non-constpointer,const data;
char* const p = &p;//constpointer,non-const data;
const char* const p = &p; //constpointer,const data;

정의에 대한 읽기는 이 해석이 괜찮다고 여겨져 왔다. 즉, *와const의 상대적인 위치로 판단하면const 문법은 변화가 많지만 깊이를 헤아릴 수 없다.키워드const가 * 왼쪽에 나타나면 피지물이 상수임을 나타냅니다.* 오른쪽에 나타나면 포인터 자체가 상수임을 나타냅니다.* 양쪽에 나타나면 피지물과 포인터가 모두 상수임을 나타냅니다.만약 가리키는 것이 상량이라면, 어떤 프로그래머는 키워드const를 유형 앞에 쓰고, 어떤 사람들은 그것을 유형 다음, * 앞에 쓴다.두 글꼴의 의미는 동일하므로 다음 두 정의는 동일합니다.
const Widget* w;
Widget const* w;

사실은 매우 간단하다. const와 *의 우선순위가 같고 오른쪽에서 왼쪽으로 읽는다. 즉,'오른쪽 왼쪽 법칙'은 사실 const는 특정한 주소에 저장된 내용을 한정하여 수정할 수 없다. 예를 들어 int*p;p를 바늘로 읽고 int를 가리키기 때문에 p는 int를 가리키는 바늘 int*constp;p는 상수, 지침, int를 가리키기 때문에 p는 int를 가리키는 상수 지침으로 p는 intconst*p를 수정할 수 없습니다.p는 바늘, 가리키는 상수, int이기 때문에 p는 int 상수를 가리키는 바늘, *p는 int**constp를 수정할 수 없습니다.p는 상수, 지침, 지침은 int를 가리키기 때문에 p는 int형 지침을 가리키는 상수 지침으로 p는 intconst**p를 수정할 수 없습니다.p는 바늘, 바늘, 바늘은 상수 int를 가리키기 때문에 p는 바늘, int 상수를 가리키는 바늘, *p는 int를 가리키며 int*const*p를 수정할 수 없습니다.p는 바늘을 가리키고 상수를 가리키며 이 상수는 바늘을 가리키기 때문에 p는 바늘을 가리키고 상수 바늘을 가리키며 *p는 바늘을 가리키며 int**const*p를 수정할 수 없습니다.p는 바늘, 상수는 바늘을 가리키는 바늘, p는 바늘, 상수형 바늘을 가리키는 바늘, *p는 바늘을 가리키는 바늘로 int*const*p를 수정할 수 없습니다.p는 포인터, 포인터 1을 가리키고, 포인터 1은 상수를 가리키며, 상수는 int를 가리키는 포인터, 즉 p는 포인터, 상수 포인터를 가리키는 포인터, *p는 int를 가리키는 포인터로 수정할 수 없습니다.

좋은 웹페이지 즐겨찾기