저의 개인적인 견해는 화살표가이 방법을 가리 키거나 포인터를 이해하기 어렵게 만드는 그림입니다. 그것들을 추상적이고 신비한 존재처럼 보이게합니다. 그들은 아닙니다.
컴퓨터의 다른 모든 것과 마찬가지로 포인터는 숫자입니다. 입니다. "포인터"라는 이름은 "주소를 포함하는 변수"라는 멋진 표현입니다.
따라서 컴퓨터가 실제로 어떻게 작동하는지 설명함으로써 주변 환경을 자극하겠습니다.
우리는 int
이름 i
과 값 5를가집니다. 이것은 메모리에 저장됩니다. 메모리에 저장된 모든 것과 마찬가지로 주소가 필요하거나 찾을 수 없습니다. 말은 수 있습니다 i
주소 0x12345678에 끝과 그 친구 j
그냥 후 6 개 끝을 값. int가 4 바이트이고 포인터가 4 바이트 인 32 비트 CPU를 가정하면 변수는 다음과 같이 실제 메모리에 저장됩니다.
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
이제 우리는이 변수들을 지적하려고합니다. int int* ip1
, 및 하나에 대한 하나의 포인터를 만듭니다 int* ip2
. 컴퓨터의 모든 것과 마찬가지로 이러한 포인터 변수도 메모리 어딘가에 할당됩니다. 이들이 메모리 바로 다음에 인접한 주소에서 끝나는 것으로 가정하자 j
. 이전에 할당 된 변수 ip1=&i;
의 주소 ( "i의 주소를 ip1로 복사")와를 포함하도록 포인터를 설정했습니다 ip2=&j
. 줄 사이에 일어나는 일은 다음과 같습니다.
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
우리가 얻은 것은 아직 숫자를 포함하는 4 바이트의 메모리 덩어리였습니다. 보이지 않는 곳에 신비로운 마법 화살이 없습니다.
실제로 메모리 덤프를 살펴보면 주소 0x12345680에 int
또는int*
. 차이점은 프로그램이이 주소에 저장된 내용을 사용하도록 선택하는 방법입니다. (우리 프로그램의 임무는 실제로 CPU 에게이 숫자로 무엇을 해야하는지 알려주는 것입니다.)
그런 다음을 사용하여 또 다른 수준의 간접 성을 추가 int** ipp = &ip1;
합니다. 다시, 우리는 단지 메모리 덩어리를 얻습니다.
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
패턴이 익숙한 것 같습니다. 숫자를 포함하는 4 바이트의 또 다른 청크.
위의 가상의 작은 RAM의 메모리 덤프가 있으면 이러한 포인터가 가리키는 위치를 수동으로 확인할 수 있습니다. ipp
변수 의 주소에 저장된 내용을 들여다 보고 내용을 0x12345680으로 찾습니다. 물론 주소 ip1
가 저장 되는 주소 입니다. 그 주소로 가서 내용을 확인하고 주소를 찾을 수 있습니다.i
다음 해당 주소로 이동하여 숫자 5를 찾을 수 있습니다.
따라서 ipp의 내용을 취 *ipp
하면 포인터 변수의 주소를 얻게됩니다 ip1
. *ipp=ip2
우리는 ip2를 ip1에 복사하여 쓰는 것과 동일합니다 ip1=ip2
. 두 경우 모두
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(이 예제는 빅 엔디안 CPU에 제공되었습니다)
ipp
정의 할 때 유형을 추가 하십시오. 질문이 완료되었습니다. ;-)