C# 안전하지 않은 코드
C#에서는 코드 블록이 안전하지 않은 수정자로 표시된 경우 함수에서 포인터 변수를 사용할 수 있습니다. 안전하지 않은 코드 또는 관리되지 않는 코드는 포인터 변수를 사용하는 코드 블록입니다.
포인터 변수
포인터는 값이 다른 변수의 주소, 즉 메모리 위치의 직접 주소인 변수입니다. 다른 변수나 상수와 마찬가지로 포인터를 사용하여 다른 변수의 주소를 저장하기 전에 포인터를 선언해야 합니다.
포인터 변수 선언의 일반적인 형식은 다음과 같습니다.
type *var-name;
다음은 유효한 포인터 선언입니다.
int *ip; /* 指向一个整数 */ double *dp; /* 指向一个双精度数 */ float *fp; /* 指向一个浮点数 */ char *ch /* 指向一个字符 */
다음 예에서는 C# 런타임 포인터 사용법:
using System; namespace UnsafeCodeApplication { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} ", var); Console.WriteLine("Address is: {0}", (int)p); Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Data is: 20 Address is: 99215364
전체 메서드가 안전하지 않다고 선언하는 것을 피할 수도 있습니다. 코드의 경우 메서드의 일부만 안전하지 않은 코드로 선언하면 됩니다. 다음 예에서는 이 점을 보여줍니다.
포인터를 사용하여 데이터 값 검색
ToString() 메서드를 사용하면 포인터 변수가 참조하는 위치에 저장된 데이터를 검색할 수 있습니다. 다음 예는 이를 보여줍니다.
using System; namespace UnsafeCodeApplication { class Program { public static void Main() { unsafe { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} " , var); Console.WriteLine("Data is: {0} " , p->ToString()); Console.WriteLine("Address is: {0} " , (int)p); } Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Data is: 20 Data is: 20 Address is: 77128984
메서드 인수로 포인터 전달
포인터 변수를 메소드의 매개변수로 메소드에 전달할 수 있습니다. 다음 예는 이를 보여줍니다.
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe void swap(int* p, int *q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { TestPointer p = new TestPointer(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2); p.swap(x, y); Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Before Swap: var1: 10, var2: 20 After Swap: var1: 20, var2: 10
포인터를 사용하여 배열 요소에 액세스
C#에서는 배열 이름과 배열 데이터와 동일한 데이터 유형을 가리키는 포인터가 다른 변수 유형입니다. 예를 들어 int *p와 int[] p는 서로 다른 유형입니다. 포인터 변수 p는 메모리에 고정되어 있지 않기 때문에 증가시킬 수 있지만 배열 주소는 메모리에 고정되어 있으므로 배열 p를 증가시킬 수 없습니다.
따라서 포인터 변수를 사용하여 배열 데이터에 액세스해야 하는 경우 C 또는 C++에서 일반적으로 수행하는 것처럼 고정 키워드를 사용하여 포인터를 수정할 수 있습니다.
다음 예는 이를 보여줍니다.
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* 显示指针中数组地址 */ for ( int i = 0; i < 3; 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] = 10 Address of list[1] = 31627172 Value of list[1] = 100 Address of list[2] = 31627176 Value of list[2] = 200
컴파일은 안전 코드가 아닙니다.
안전하지 않은 코드를 컴파일하려면 명령줄 컴파일러로 전환하고 /unsafe 명령줄을 지정해야 합니다.
예를 들어 안전하지 않은 코드가 포함된 prog1.cs라는 프로그램을 컴파일하려면 명령줄에 다음 명령을 입력합니다.
csc /unsafe prog1.cs
Visual Studio IDE를 사용하는 경우 프로젝트 속성에서 안전하지 않은 코드를 활성화해야 합니다.
단계는 다음과 같습니다.
솔루션 탐색기에서 속성 노드를 두 번 클릭하여 프로젝트 속성을 엽니다.
빌드 탭을 클릭하세요.
'안전하지 않은 코드 허용' 옵션을 선택하세요.
위 내용은 [c# 튜토리얼] C# unsafe code 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!