검수요청.png검수요청.png

"역참조"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
잔글 (같이 보기)
1번째 줄: 1번째 줄:
'''역참조'''란 프로그래밍에서 포인터는 데이터가 저장된 주소값을 가리키지만 데이터가 저장된 주소로 가서 값에 접근 하는것을 역참조라고 한다.
+
'''역참조'''란 프로그래밍에서 데이터가 저장된 [[주소]]로 가서, 그 주소에 해당하는 데이터 값에 접근하는 것을 말한다. [[포인터]](pointer)는 데이터가 저장된 주소값을 가리키지만, 역참조는 그 반대로 주소를 통해 데이터에 접근한다.
  
 
== 개요 ==
 
== 개요 ==
역참조는 값에 직접 접근하는것이 아닌 주소를 이용해 간접적으로 접근하는 것이다. 그래서 간접 연산자라고도 한다. 이제까지 함수에서 매개변수를 통해 인자를 전달하는 등 모든 데이터를 복사해서 썼다면 역참조를 하면 원본에 접근가능하다. 즉 컴퓨터 구조에서(CPU, 메모리 등) 데이터를 오랫동안 메모리에 저장할 수 있다.
+
역참조는 값에 직접 접근하는 것이 아니라 [[주소]]를 이용해 간접적으로 접근하는 것이다. 그래서 '간접연산자'라고도 한다. 이제까지 [[함수]]에서 [[매개변수]]를 통해 [[인자]]를 전달하는 등 모든 데이터를 복사해서 썼다면, 역참조를 하면 원본에 접근 가능하다. 즉 컴퓨터 구조에서(CPU, 메모리 등) 데이터를 오랫동안 메모리에 저장할 수 있다.
 +
 
 
* '''역참조 원리'''
 
* '''역참조 원리'''
 
:* 1. 포인터를 지정하고 있는 메모리 위치로 간다.
 
:* 1. 포인터를 지정하고 있는 메모리 위치로 간다.
38번째 줄: 39번째 줄:
 
  printf("%d\n", *numPtrB);    // 22: 역참조로 값을 가져옴, numArr[1]과 같음
 
  printf("%d\n", *numPtrB);    // 22: 역참조로 값을 가져옴, numArr[1]과 같음
 
  printf("%d\n", *numPtrC);    // 33: 역참조로 값을 가져옴, numArr[2]와 같음
 
  printf("%d\n", *numPtrC);    // 33: 역참조로 값을 가져옴, numArr[2]와 같음
이번에는 포인터 연산과 동시에 역참조 연산을 사용하는 법을 알아보겠다. 다음과 같이 포인터 연산을 한 부분을 () 괄호로 묶어준 뒤 맨 앞에 *를 붙이면 된다.<ref>〈[https://dojang.io/mod/page/view.php?id=510 C 언어 코딩 도장:59.2 포인터 연산과 역참조 사용하기]〉, 《코딩도장》, </ref>
+
이번에는 포인터 연산과 동시에 역참조 연산을 사용하는 법을 알아보겠다. 다음과 같이 포인터 연산을 한 부분을 () 괄호로 묶어준 뒤 맨 앞에 *를 붙이면 된다.<ref>〈[https://dojang.io/mod/page/view.php?id=510 C 언어 코딩 도장:59.2 포인터 연산과 역참조 사용하기]〉, 《코딩도장》</ref>
  
 
{{각주}}
 
{{각주}}

2021년 7월 27일 (화) 20:06 판

역참조란 프로그래밍에서 데이터가 저장된 주소로 가서, 그 주소에 해당하는 데이터 값에 접근하는 것을 말한다. 포인터(pointer)는 데이터가 저장된 주소값을 가리키지만, 역참조는 그 반대로 주소를 통해 데이터에 접근한다.

개요

역참조는 값에 직접 접근하는 것이 아니라 주소를 이용해 간접적으로 접근하는 것이다. 그래서 '간접연산자'라고도 한다. 이제까지 함수에서 매개변수를 통해 인자를 전달하는 등 모든 데이터를 복사해서 썼다면, 역참조를 하면 원본에 접근 가능하다. 즉 컴퓨터 구조에서(CPU, 메모리 등) 데이터를 오랫동안 메모리에 저장할 수 있다.

  • 역참조 원리
  • 1. 포인터를 지정하고 있는 메모리 위치로 간다.
  • 2. 그곳에 저장된 값에 접근한다.[1]

예제

포인터 연산으로 조작한 메모리 주소도 역참조 연산을 사용하여 메모리에 접근할 수 있다. 다음 코드를 살펴보겠다.

#include <stdio.h>
int main()
{
   int numArr[5] = { 11, 22, 33, 44, 55 };
   int *numPtrA;
   int *numPtrB;
   int *numPtrC;

   numPtrA = numArr;    // 배열 첫 번째 요소의 주소를 포인터에 저장

   numPtrB = numPtrA + 1;    // 포인터 연산. numPtrA + 4바이트
   numPtrC = numPtrA + 2;    // 포인터 연산. numPtrA + 8바이트

   printf("%d\n", *numPtrB);    // 22: 역참조로 값을 가져옴, numArr[1]과 같음
   printf("%d\n", *numPtrC);    // 33: 역참조로 값을 가져옴, numArr[2]와 같음

   return 0;
}
실행 결과
22
33

numPtrB에는 numPtrA에 1을 더해서 4바이트만큼 순방향으로 이동한 메모리 주소를 저장했고, numPtrC에는 numPtrA에 2를 더해서 8바이트만큼 순방향으로 이동한 메모리 주소를 저장했다.

numPtrB = numPtrA + 1;    // 포인터 연산. numPtrA + 4바이트
numPtrC = numPtrA + 2;    // 포인터 연산. numPtrA + 8바이트

numPtr8와 numPtrC도 일반 포인터이므로 * (역참조 연산자)를 사용하여 메모리의 값을 가져올 수 있다. 여기서 포인터 연산은 결과적으로 numPtrA + 1과 numArr[1]은 같고, numPtrA와 numArr[2]는 같다.

printf("%d\n", *numPtrB);    // 22: 역참조로 값을 가져옴, numArr[1]과 같음
printf("%d\n", *numPtrC);    // 33: 역참조로 값을 가져옴, numArr[2]와 같음

이번에는 포인터 연산과 동시에 역참조 연산을 사용하는 법을 알아보겠다. 다음과 같이 포인터 연산을 한 부분을 () 괄호로 묶어준 뒤 맨 앞에 *를 붙이면 된다.[2]

각주

참고자료

같이 보기


  검수요청.png검수요청.png 이 역참조 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.