Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 포인터를 사용해 배열 요소에 접근하는 방법

C#에서는 배열 이름과 배열 요소와 동일한 데이터 형식을 가리키는 포인터가 서로 다른 변수 형식입니다. 예를 들어 int *pint[] p는 같은 형식이 아닙니다.

포인터 변수는 메모리상에 고정되어 있지 않기 때문에 값을 증가시킬 수 있습니다. 반면 배열의 주소는 메모리에 고정되어 있으므로 직접 증가시킬 수 없습니다. 따라서 배열을 포인터로 다루려면 fixed 키워드를 사용해 배열을 메모리에 고정한 후, 그 주소를 포인터에 할당해야 합니다. fixed 블록 내에서는 가비지 컬렉터가 배열을 이동시키지 않으므로 안전하게 포인터 연산을 수행할 수 있습니다.

또한 포인터를 사용하려면 코드에 unsafe 키워드를 지정하고, 컴파일 시 /unsafe 옵션을 활성화해야 합니다.

다음은 포인터를 사용하여 배열 요소의 주소와 값에 접근하는 예제입니다.

예제 코드

using System;

namespace UnsafeCodeApplication {
   class TestPointer {
      public unsafe static void Main() {
         int[] list = {5, 25};
         fixed(int *ptr = list)

         /* 포인터에 배열 주소를 저장 */
         for ( int i = 0; i < 2; i++) {
            Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
            Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

실행 결과

Address of list[0] = 31627168
Value of list[0] = 5
Address of list[1] = 31627172
Value of list[1] = 25

실행 결과를 보면 각 배열 요소의 주소가 int 크기인 4바이트씩 증가하는 것을 확인할 수 있습니다. 포인터 산술 연산(ptr + i)을 통해 배열의 각 요소에 순차적으로 접근하고, 역참조 연산자(*)를 사용해 해당 메모리 위치에 저장된 실제 값을 읽어오는 구조입니다.