우리는 C 언어에서 포인터 변수가 메모리 주소를 저장할 수 있다는 것을 알고 있으며, 이 기사에서는 해당 포인터를 사용하여 포인터가 가리키는 메모리 위치에 저장된 데이터에 액세스하는 방법을 배웁니다.
포인터란 무엇입니까?
먼저 포인터가 무엇인지 살펴보겠습니다. 포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터는 포인터가 가리키는 메모리 주소의 데이터를 조작하는 데 도움이 됩니다. 또한 여러 포인터가 동일한 메모리를 가리킬 수 있습니다.
다음 예를 고려하십시오.
int num = 10; int *ptr; ptr = #>
우리는 주소를 저장했습니다 하나에 의 변수 ptr 포인터이지만 이제는 포인터가 가리키는 주소의 메모리에 저장된 값에 액세스하는 방법입니다. ptr ? 여기서 역참조가 작동합니다.
C의 역참조 포인터
역참조 또는 간접 연산자(*)를 사용하여 포인터가 가리키는 메모리 주소에 저장된 내용에 액세스하거나 조작하는 것을 포인터 역참조라고 합니다.
C에서 포인터 역참조
내 브라우저 설정은 어디서 찾을 수 있어?
포인터 역참조 구문
포인터를 역참조하기 위해 간접 연산자(*)를 접두어로 사용합니다.
* ( pointer_name )>
메모리에 저장된 데이터를 수정하려면 다음을 사용합니다.
* ( pointer_name ) = new_value;>
new_value는 이전 값과 동일한 유형이어야 한다는 점에 유의하세요.
VLC 유튜브 비디오 다운로드
위의 예를 고려하십시오. ptr ~를 가리키다 여부, t 메모리 주소의 내용은 역참조 연산자 *를 통해 액세스할 수 있습니다. 이제 *ptr은 주소 10에 저장된 콘텐츠를 가져옵니다.
num 및 ptr 메모리 주소와 값은 다음과 같습니다.
| 변하기 쉬운 | 메모리 주소 | 값 |
|---|---|---|
| 숫자 = 10 | 202020 | 10 |
| 202021 | ||
| 202022 | ||
| 202023 | ||
| ptr = &num | 202024 – 202032 | 202020 |
메모: 위 예의 아키텍처는 바이트 주소 지정이 가능하다고 가정했습니다. 즉, 별도의 주소를 갖는 최소 단위는 바이트입니다.
포인터 역참조의 예
예시 1:
포인터를 사용하여 정수 변수의 값에 액세스하고 수정합니다.
씨
김프를 jpg로 내보내기
// C Program to illustrate the dereferencing of pointer> #include> int> main()> {> >// Declare integer variable number> >int> num = 10;> >// Declare pointer to store address of number> >int>* ptr = #> >// Print the value of number> >printf>(>'Value of num = %d
'>, num);> >// Print Address of the number using & operator> >printf>(>'Address of num = %d
'>, &num);> >// Print Address stored in the pointer> >printf>(>'Address stored in the ptr = %p
'>, ptr);> >printf>(>'Dereference content in ptr using *ptr
'>);> >// Access the content using * operator> >printf>(>'Value of *ptr = %d
'>, *ptr);> >printf>(>'Now, *ptr is same as number
'>);> >printf>(>'Modify the value using pointer to 6
'>);> >// Modify the content in the address to 6 using pointer> >*ptr = 6;> >// Print the modified value using pointer> >printf>(>'Value of *ptr = %d
'>, *ptr);> >// Print the modified value using variable> >printf>(>'Value of number = %d
'>, num);> >return> 0;> }> |
>
>
정상적인 형태
산출
Value of num = 10 Address of num = 0x7ffe47d51b4c Address stored in the ptr = 0x7ffe47d51b4c Dereference content in ptr using *ptr Value of *ptr = 10 Now, *ptr is same as number Modify the value using pointer to 6 Value of *ptr = 6 Value of number = 6>
예제 2: 이중 포인터 역참조
동일한 논리를 사용하여 이중 포인터를 역참조할 수도 있지만 간접 연산자를 두 번 사용해야 합니다. 하나는 이중 포인터가 가리키는 포인터로 이동하기 위한 것이고 다른 하나는 실제 값에 액세스하기 위한 것입니다.
씨
// C program to dereference double pointer> #include> int> main()> {> >int> var = 10;> >int>* ptr = &var;> >// double pointer> >int>** dptr = &ptr;> >// dereferencing the double pointer> >printf>(>'Accesing value from double pointer using '> >'**dptr: %d'>,> >**dptr);> >return> 0;> }> |
>
mysql은 모든 사용자를 보여줍니다
>산출
Accesing value from double pointer using **dptr: 10>
마찬가지로 모든 수준의 포인터를 역참조할 수 있습니다.
역참조는 어떻게 작동하나요?
컴파일러에게 포인터 역참조를 요청할 때마다 컴파일러는 세 가지 작업을 수행합니다.
- 먼저 포인터에 저장된 주소를 찾습니다.
- 그런 다음 읽을 메모리 양을 추론할 수 있도록 포인터 유형을 찾습니다. 예를 들어 int는 4바이트, char은 1바이트 등입니다. 이는 시스템의 모든 포인터 크기가 동일하더라도 선언에서 포인터 유형을 지정해야 하는 주된 이유이기도 합니다.
- 마지막으로 메모리를 읽고 저장된 데이터를 반환합니다.
메모: 위의 추론에서 우리는 void 포인터가 가리키는 데이터의 크기를 알 수 없기 때문에 void 포인터를 역참조할 수 없다는 것을 추론할 수도 있습니다. 따라서 역참조하려면 void 포인터를 타입캐스트해야 합니다.