포인터는 다른 변수의 메모리 주소를 포함하는 변수로 정의됩니다. C#의 포인터는 안전하지 않고 unsafe 키워드로 표시된 문이 있을 때마다 사용됩니다. 이러한 유형의 명령문은 가비지 수집기의 제어를 받지 않으며 포인터 변수를 사용합니다.
구문: 포인터는 다음과 같이 선언할 수 있습니다.
type *var name; int* a;
여기서 *는 역참조 연산자라고 하며 a는 int 유형의 주소를 포함하는 변수입니다.
예
int *p = & x; // where &x is the memory address of x Console.WriteLine((int)p) // displaying memory address Console.WriteLine(*p) // displaying value at memory address
다음은 C#에서 어떻게 작동하는지 보여주는 예입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Pointers { class Demo { public void Method() { unsafe { int a = 40; int b = 20; int* ptr1 = &a; int* ptr2 = &b; Console.WriteLine(*ptr1); // displaying the value Console.WriteLine(*ptr2); // displaying the value Console.WriteLine((int)ptr1); // displaying the address Console.WriteLine((int)ptr2); // displaying the address } } } class Example { // main method public static void Main() { Demo d = new Demo(); d.Method(); } } }
수정자, 생성자 등과 같이 안전하지 않은 명령문을 실행하는 방법에는 여러 가지가 있습니다. 위의 예에서 명령문 그룹은 안전하지 않은 것으로 표시됩니다. 위의 코드에는 값이 각각 40과 20인 두 개의 변수 a와 b가 있으며 포인터에는 해당 주소가 포함되어 있습니다. Console.WriteLine()은 변수의 값과 주소를 표시하는 데 사용됩니다.
출력:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Pointers { class Demo { public unsafe void Method() { int a = 50; int b = 20; int* ptr1 = &a; int* ptr2 = &b; Console.WriteLine(*ptr1); // displaying the value Console.WriteLine(*ptr2); // displaying the value Console.WriteLine((int)ptr1); // displaying the address Console.WriteLine((int)ptr2); // displaying the address } } class Example { // main method public static void Main() { Demo d = new Demo(); d.Method(); } } }
위의 예에서는 값이 각각 50과 20인 두 개의 변수 a와 b가 있는 메서드와 함께 unsafe가 사용되었습니다. 포인터 *ptr1과 *ptr2는 메모리 주소를 가리킵니다.
출력:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Pointers { class Demo { public unsafe static void Main() { int[] array = { 10, 20, 30, 40, 50 }; // declaring array fixed (int* ptr = array) // fixed for pinning the object /* let us have array address in pointer */ for (int i = 0; i < 5; i++) { Console.WriteLine("Value of array[{0}]={1}", i, *(ptr + i)); Console.WriteLine("Address of array[{0}]={1}", i, (int)(ptr + i)); Console.ReadKey(); } } } }
위 코드에서는 5개의 요소로 구성된 배열을 정의하고 Console.WriteLine()을 사용하여 배열 요소의 값과 배열 요소의 주소를 표시합니다. C#에는 개체 고정이라는 개념이 있습니다. 위 코드에서는 가비지 수집기가 개체를 이동하고 "고정"하지 못하도록 개체 고정에 고정 문을 사용했습니다. 런타임 효율성에 영향을 미칠 수 있습니다.
출력:
using System; namespace Pointers { // Struct employee struct Employee { // members // employee id and salary public int empid; public double salary; // Constructor to initialize values public Employee(int e, double s) { empid = e; salary = s; } }; // end of struct class Program { // Main Method static void Main(string[] args) { // unsafe so as to use pointers unsafe { // Declaring two employee Variables Employee E1 = new Employee(798, 30000); Employee E2 = new Employee(799, 31000); // Declaring two employee pointers // and initializing them with addresses // of E1 and E2 Employee* E1_ptr = &E1; Employee* E2_ptr = &E2; // Displaying details of employees using pointers // Using the arrow ( -> ) operator Console.WriteLine("Details of Employee 1"); Console.WriteLine("Employee Id: {0} Salary: {1}", E1_ptr->empid, E1_ptr->salary); Console.WriteLine("Details of Employee 2"); Console.WriteLine("Employee Id: {0} Salary: {1}", E2_ptr->empid, E2_ptr->salary); } // end unsafe } // end main } // end class }
위 예에서 직원 ID와 급여를 멤버로 포함하는 직원 구조체와 매개변수화 생성자를 사용하여 값을 초기화합니다. 포인터는 참조 유형을 포함하는 구조체 대신 기본 값 유형을 포함하는 구조체를 가리킵니다. 기본 메소드에는 주소 E1 및 E2로 초기화되는 두 개의 직원 변수와 직원 포인터가 있습니다. Console.WriteLine()은 포인터를 사용하여 직원의 세부 정보를 표시하는 데 사용됩니다.
출력:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Pointers { class Demo { public static void Main() { unsafe { int* arr = stackalloc int[6]; // declaring array arr[0] = 10; arr[1] = 20; arr[2] = 30; arr[3] = 40; arr[4] = 50; arr[5] = 60; for (int i = 0; i < 6; i++) { Console.WriteLine($"Value at {i}: {arr[i]}"); Console.ReadKey(); } } } } }
위 코드에서는 스택에 메모리를 할당하는 stackalloc 키워드를 사용했습니다. 스택 블록에서 실행되는 메모리는 메서드 실행 중에 생성됩니다. stackalloc은 성능이 더 좋고 배열을 고정할 필요가 없습니다. 메소드가 반환될 때 자동으로 해제되므로 해제할 필요가 없기 때문에 힙 할당 배열보다 낫습니다.
출력:
포인터에서 변환은 암시적 및 명시적 유형입니다. 암시적 유형의 변환은 void* 유형에 대한 포인터 유형 및 포인터 유형에 대한 null과 같습니다. 명시적 유형에서는 byte, sbyte, ushort, short, uint, int, ulong, long에서 임의의 포인터 유형으로 또는 그 반대로 변환되며 하나의 포인터가 다른 포인터로 변환됩니다.
그래서 포인터는 메모리 주소를 가리키고 안전하지 않은 명령문 코드로 실행하는 데 사용됩니다. 관리되지 않는 환경에서만 사용되며 가비지 수집기에 의해 추적되지 않습니다. 포인터는 스택, 큐 등에서 사용됩니다.
위 내용은 C#의 포인터의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!