2010-11-22 5 views
1

내가 지금까지 배웠 듯이, 포인터는 메모리 주소가 저장되는 메모리 (힙)의 위치이며, 실제로 이해할 수 있고 그렇게 쉽게 처리 할 수 ​​있지만 질문은 : 주소 만 저장하는 경우, 크기는 컴퓨터의 메모리 크기 인 대칭입니다. 그리고 모든 포인터의 크기는입니다. 포인터가 형식을 갖는 이유는 포인터 X가 정수로 정의 된 경우 poiter와 크기가 같습니다. Y는 정의 된 char입니다. 왜 double 또는 x에서 integer 로의 diffrenet의 주소를 할당 할 때 컴파일러 또는 런타임 오류가 발생합니까? Y에 대해서도 마찬가지입니까? 형식을 결정하는 포인터의 구조에 추가 구성 요소가 있습니까?포인터의 실제 구조는 무엇입니까?

포인터의 실제 구조, 정확히 작동하는 방식 및 형식이 필요한 이유를 알고 싶습니다. 사전 :

주에서

감사 : 나는 언어를 지정해야하는 경우, 그것은 C++

답변

3

네 말이 맞아이 포인터는 단지 메모리 주소를 포함, 그리고 주어진에 이렇게 모든 포인터 기계는 정확히 같은 크기입니다.

유형 및 해당 컴파일러 오류는 여기에 일치하는 코드을 작성하는 데 도움이됩니다. 그러나 일단 코드가 컴파일되면 포인터의 메모리 구조에있는 어떤 것도 그 타입에 대해 아무 것도 말할 수 없습니다.

-1

포인터가 스택에 저장되어 있다고 생각하고 힙의 위치를 ​​가리 켰습니까?

포인터에는 유형 안전성을 제공하는 변수와 마찬가지로 '유형'이 있으며 컴파일 타임에 문제를 해결할 수 있습니다. 그러나 이것은 컴파일시에만 (어쨌든 C에서)주의하십시오.

실제로 코드를 통해 포인터를 메모리 위치로 설정할 수 있으며 이는 바이러스가 악용하는 코드 및 취약성에서 많은 문제를 일으 킵니다. 포인터를 사용하여 배열을 따라 걷는 것은 흔한 트릭이지만 포인터가 배열의 끝을 넘어서서 예상치 못한 메모리 부분에 액세스하여 수정하도록 허용합니다.

+0

포인터는 컴파일러가 주소로 해석 할 값입니다. 힙, 스택 또는 레지스터에 일시적으로 저장 될 수 있습니다. 그리고 배열의 끝에서 벗어날 수있는 포인터가 필요하지 않습니다. 색인을 사용하여 쉽게이 작업을 수행 할 수 있습니다. –

+0

오, 글쎄, 새로운 것을 배워라. –

0

포인터가 초기화 될 때 포인터가 가리키는 데이터의 첫 번째 바이트를 가리 킵니다. 예를 들어, int 포인터가 데이터를 가리키는 경우. 45 포인터는 값 4 또는 5를 가리킬 수 있습니다 (기계의 끝 부분에 따라 다름). 유사한 방식으로, 이중 포인터는 가리키는 데이터의 메모리에있는 첫 번째 바이트를 가리 킵니다.

이렇게하면 모든 포인터의 크기가 같습니다.

이제 포인터의 유형에 따라 메모리의 데이터에 액세스합니다. 따라서 int가 16 비트 인 16 비트 컴퓨터에서이 포인터가 역 참조 될 때 메모리에서 2 바이트 데이터가 참조됩니다 (포인터가 가리키는 메모리에서 시작 바이트 및 다음 직접 바이트 포함). 비슷한 방식으로 긴 포인터가 참조 해제 될 때 4 바이트가 참조됩니다.

일반적으로 포인터 역 참조가 일반적으로 작동하는 방식입니다. 즉, 포인터에는 데이터를 정확하게 참조하기위한 유형이 있습니다. 그리고 모든 포인터는 본질적으로 동일한 크기, 즉 1 바이트를 갖는다. 희망은 충분합니다.

1

포인터의 실제 구조를 알지 못합니다. (제가 생각하기에 주제를 살펴볼 것이므로 오토 마톤 이론과 프로그래밍 언어 디자인 또는 필기체 작성자 주제에서 뭔가를 찾을 수있을 것 같아요) 하지만 포인터는 데이터 타입을 가지고 있다고 생각합니다. 그래서 컴퓨터는 얼마나 많은 메모리가 포인터를 가리키고 있는지, 다른 말로하면 포인터가 double을 가리키고 있다고 생각합니다. 포인터가 포인터가 포인터의 첫 번째 단어의 주소를 가리킨다 고 생각합니다. double이 필요하지만 포인터가 가리키는 값과 일치하는 유형이없는 경우 화면에 이중을 출력하려고한다고 가정합니다. 컴퓨터가 화면에 인쇄해야하는 바이트 수를 어떻게 알 수 있습니까?

관련 문제