C#의 포인터

王林
풀어 주다: 2024-09-03 15:06:41
원래의
597명이 탐색했습니다.

포인터는 다른 변수의 메모리 주소를 포함하는 변수로 정의됩니다. 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#에서 포인터는 어떻게 작동하나요?

다음은 C#에서 어떻게 작동하는지 보여주는 예입니다.

C#의 포인터 – 예 #1

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()은 변수의 값과 주소를 표시하는 데 사용됩니다.

출력:

C#의 포인터

C#의 포인터 – 예 #2

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는 메모리 주소를 가리킵니다.

출력:

C#의 포인터

C#의 포인터 – 예 #3

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#에는 개체 고정이라는 개념이 있습니다. 위 코드에서는 가비지 수집기가 개체를 이동하고 "고정"하지 못하도록 개체 고정에 고정 문을 사용했습니다. 런타임 효율성에 영향을 미칠 수 있습니다.

출력:

C#의 포인터

C#의 포인터 – 예 #4

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()은 포인터를 사용하여 직원의 세부 정보를 표시하는 데 사용됩니다.

출력:

C#의 포인터

C#의 포인터 – 예 #5

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은 성능이 더 좋고 배열을 고정할 필요가 없습니다. 메소드가 반환될 때 자동으로 해제되므로 해제할 필요가 없기 때문에 힙 할당 배열보다 낫습니다.

출력:

C#의 포인터

포인터에서 변환은 암시적 및 명시적 유형입니다. 암시적 유형의 변환은 void* 유형에 대한 포인터 유형 및 포인터 유형에 대한 null과 같습니다. 명시적 유형에서는 byte, sbyte, ushort, short, uint, int, ulong, long에서 임의의 포인터 유형으로 또는 그 반대로 변환되며 하나의 포인터가 다른 포인터로 변환됩니다.

결론 – C#의 포인터

그래서 포인터는 메모리 주소를 가리키고 안전하지 않은 명령문 코드로 실행하는 데 사용됩니다. 관리되지 않는 환경에서만 사용되며 가비지 수집기에 의해 추적되지 않습니다. 포인터는 스택, 큐 등에서 사용됩니다.

위 내용은 C#의 포인터의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿