C# Language
포인터 및 안전하지 않은 코드
수색…
안전하지 않은 코드 소개
C #은 unsafe
수정자가 표시 할 때 코드 블록의 함수에서 포인터 변수를 사용할 수 있습니다. 안전하지 않은 코드 또는 비 관리 코드는 포인터 변수를 사용하는 코드 블록입니다.
포인터는 변수가 다른 변수의 주소, 즉 메모리 위치의 직접 주소 인 변수입니다. 어떤 변수 나 상수와 비슷하지만 변수 주소를 저장하기 전에 포인터를 선언해야합니다.
포인터 선언의 일반적인 형식은 다음과 같습니다.
type *var-name;
다음은 유효한 포인터 선언입니다.
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
다음 예제는 안전하지 않은 한정자를 사용하여 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
전체 메서드를 안전하지 않은 것으로 선언하는 대신 코드의 일부를 안전하지 않은 것으로 선언 할 수도 있습니다.
// safe code
unsafe
{
// you can use pointers here
}
// safe code
포인터를 사용하여 데이터 값 검색
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
는 메모리에 고정되어 있지 않지만 배열 주소가 메모리에 고정되어 있기 때문에 증가시킬 수 있으며 증가시킬 수 없습니다.
따라서 포인터 변수를 사용하여 배열 데이터에 액세스해야한다면 C 또는 C ++에서 전통적으로하는 것처럼 fixed 키워드를 사용하여 포인터를 수정해야합니다.
다음 예제에서는이를 보여줍니다.
using System;
namespace UnsafeCodeApplication
{
class TestPointer
{
public unsafe static void Main()
{
int[] list = {10, 100, 200};
fixed(int *ptr = list)
/* let us have array address in pointer */
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를 사용하는 경우 프로젝트 속성에서 안전하지 않은 코드를 사용하도록 설정해야합니다.
이것을하기 위해:
- 솔루션 탐색기에서 속성 노드를 두 번 클릭하여 프로젝트 속성을 엽니 다.
- 빌드 탭을 클릭하십시오.
- "안전하지 않은 코드 허용"옵션을 선택하십시오.