포인터 형식(C# 프로그래밍 가이드)
안전하지 않은 컨텍스트에서는 형식이 포인터 형식, 값 형식 또는 참조 형식이 될 수 있습니다.포인터 형식 선언은 다음 형식 중 하나를 사용합니다.
type* identifier;
void* identifier; //allowed but not recommended
포인터 형식은 다음과 같은 형식일 수 있습니다.
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal 또는 bool
임의의 열거형
임의의 포인터 형식
관리되지 않는 형식의 필드만 포함하는 임의의 사용자 정의 구조체 형식
포인터 형식은 개체에서 상속되지 않으며 포인터 형식과 object는 서로 변환되지 않습니다.또한 boxing과 unboxing은 포인터를 지원하지 않습니다.그러나 다른 포인터 형식 간의 변환 및 포인터 형식과 정수 계열 형식 사이의 변환은 허용됩니다.
동일한 선언에서 여러 포인터를 선언하는 경우 *는 기본 형식에만 함께 사용되고 각 포인터 이름의 접두사로는 사용되지 않습니다.예를 들면 다음과 같습니다.
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
개체 참조는 포인터가 해당 개체 참조를 가리키는 경우에도 가비지 수집될 수 있으므로 포인터는 참조나 참조가 들어 있는 구조체를 가리킬 수 없습니다.GC는 포인터 형식에서 개체를 가리키는지 여부를 추적하지 않습니다.
myType* 형식의 포인터 변수 값은 myType 형식의 변수 주소입니다.다음은 포인터 형식 선언의 예제입니다.
예제 |
설명 |
---|---|
int* p |
p는 정수에 대한 포인터입니다. |
int** p |
p는 정수에 대한 포인터를 가리키는 포인터입니다. |
int*[] p |
p는 정수에 대한 포인터의 1차원 배열입니다. |
char* p |
p는 문자에 대한 포인터입니다. |
void* p |
p는 알 수 없는 형식에 대한 포인터입니다. |
포인터 간접 참조 연산자 *를 사용하면 포인터 변수가 가리키는 위치의 내용에 액세스할 수 있습니다.예를 들어, 다음과 같은 선언을 생각해 볼 수 있습니다.
int* myVariable;
여기서 *myVariable 식은 myVariable에 포함된 주소에 있는 int 변수를 가리킵니다.
void* 형식의 포인터에는 간접 참조 연산자를 적용할 수 없습니다.그러나 캐스트를 사용하여 void 포인터를 다른 포인터 형식으로 변환하거나 반대로 변환할 수 있습니다.
포인터는 null일 수 있습니다.null 포인터에 간접 참조 연산자를 적용할 때 발생하는 동작은 구현에 따라 다릅니다.
메서드 사이에 포인터를 전달하면 정의되지 않은 동작이 발생할 수 있다는 사실에 주의해야 합니다.Out 또는 Ref 매개 변수를 통해, 또는 함수 결과로 지역 변수에 포인터를 반환하는 경우를 예로 들 수 있습니다.fixed 블록에서 포인터가 설정되면 이 포인터가 가리키는 변수의 고정 상태가 해제될 수 있습니다.
다음 표에서는 안전하지 않은 컨텍스트에서 포인터에 대해 수행할 수 있는 연산자와 문을 보여 줍니다.
연산자/문 |
사용할 도구 |
---|---|
* |
포인터 간접 참조를 수행합니다. |
-> |
포인터를 통해 구조체 멤버에 액세스합니다. |
[] |
포인터를 인덱싱합니다. |
& |
변수 주소를 가져옵니다. |
++, -- |
포인터를 증가 및 감소시킵니다. |
+, - |
포인터 연산을 수행합니다. |
==, !=, <, >, <=, >= |
포인터를 비교합니다. |
stackalloc |
스택에 메모리를 할당합니다. |
fixed 문 |
해당 주소를 찾을 수 있도록 임시로 변수를 고정합니다. |
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하십시오. 이 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.
참고 항목
참조
안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)
Boxing 및 Unboxing(C# 프로그래밍 가이드)