내가 포인터를 가지고 :포인터가 다른 포인터의 주소를 저장할 수없는 이유는 무엇입니까? 다음과 같이
int val2 = 90;
int *p = &val2;
을 그럼, 수행
int *pp = &p; // Line 3
Line 3
는 불법입니다. 나는 그것이 int **pp = &p
를 써야했다라는 것을 알고있다. 그러나 나는 이유를 해석하지 않는다. 포인터의 주소와 다른 일반 변수의 주소입니까?
내가 포인터를 가지고 :포인터가 다른 포인터의 주소를 저장할 수없는 이유는 무엇입니까? 다음과 같이
int val2 = 90;
int *p = &val2;
을 그럼, 수행
int *pp = &p; // Line 3
Line 3
는 불법입니다. 나는 그것이 int **pp = &p
를 써야했다라는 것을 알고있다. 그러나 나는 이유를 해석하지 않는다. 포인터의 주소와 다른 일반 변수의 주소입니까?
int *pp
는 int
에 대한 포인터로 pp
을 정의하지만, 당신은 대신 int
의 주소의 int
에 대한 포인터의 주소를 초기화하는 것입니다. "int의 주소"와 "int에 대한 포인터의 주소"가 같은 타입이 아니기 때문에, 컴파일러는 적어도 캐스트를하지 않고도 수행 할 수 없습니다. 거의 확실하게 은이 아닙니다. 그것을하고 싶다). CPU가 실제 문제없이 한 위치에서 다른 위치로 데이터를 이동 할 수 있도록
static type checker 예. 보기의 구현 지점에서 아니오. 당신이 저장하는 동안 int로 포인터로 pp
을 선언하고 있기 때문에
유형 검사가 무엇을 할당하고 주변에 통과하는 것은 당신이 그것을 선언하는 방법에 대해 올바른지 확인해야하기 때문에,
int *pp = &p;
을 거부합니다 int에 대한 포인터를 가리키는 포인터. 무언가에 대한 포인터와 다른 포인터 사이에 차이가 없더라도 특정 유형으로 선언 한 경우 점검 된 유형에 차이가 있습니다.
대부분의 플랫폼에서 모든 포인터는 메모리에서 같은 위치에 있습니다. 메모리에있는 다른 위치의 주소입니다. 이 문제는 대부분 컴퓨터가 올바른 사용을 시행 할 수 있도록 형식을 지정하려고하는 문제입니다.
잘못된 유형으로 저장해야하는 경우 다른 포인터 유형간에 언제든지 유형 변환 할 수 있습니다.
정수에 대한 포인터를 만들면 컴파일러에서 정수 주소를 지정해야합니다. 대신 정수가 아닌 포인터의 주소를 지정합니다. 컴파일러가 int를 찾을 위치를 알기 위해서는 두 번째 별표를 추가하여 pp가 메모리 주소를 가리키고 컴파일러에게 차례로 int를 가리 키도록해야합니다.
컴파일러를 무시하면 문제가 발생합니다. 코드를 컴파일하는 것뿐만 아니라 신중하게 주조하십시오. –
포인터 *는 기본적으로 모두 동일 할 수 있습니다. 많은 구현에서 그렇지만 반드시 그런 것은 아닙니다. 다른 유형의 포인터가 다른 표현을 갖는 구현도 있습니다. –