Typy wskaźników (Przewodnik programowania w języku C#)Pointer types (C# Programming Guide)

W kontekście słowa kluczowego „unsafe” typ może być typem wskaźnika, typem wartości lub typem referencyjnym.In an unsafe context, a type may be a pointer type, a value type, or a reference type. Deklaracja typu wskaźnika ma jedną z następujących form:A pointer type declaration takes one of the following forms:

type* identifier;
void* identifier; //allowed but not recommended

Typ określony przed * w typie wskaźnika jest nazywany typem referent.The type specified before the * in a pointer type is called the referent type. Tylko Typ niezarządzany może być typem referent.Only an unmanaged type can be a referent type.

Typy wskaźnika nie dziedziczą z obiektu i nie istnieją konwersje między typami wskaźnika a object.Pointer types do not inherit from object and no conversions exist between pointer types and object. Ponadto wskaźniki nie są obsługiwane w przypadku opakowywania i rozpakowywania.Also, boxing and unboxing do not support pointers. Można jednak wykonywać konwersje między różnymi typami wskaźnika oraz między typami wskaźnika a typami całkowitymi.However, you can convert between different pointer types and between pointer types and integral types.

W przypadku deklarowania wielu wskaźników w jednej deklaracji gwiazdka (*) jest pisana razem tylko z typem podstawowym; nie jest używana jako prefiks każdej nazwy wskaźnika.When you declare multiple pointers in the same declaration, the asterisk (*) is written together with the underlying type only; it is not used as a prefix to each pointer name. Na przykład:For example:

int* p1, p2, p3;   // Ok
int *p1, *p2, *p3;   // Invalid in C#

Wskaźnik nie może wskazywać odwołania lub struktury , która zawiera odwołania, ponieważ odwołanie do obiektu może być odzyskiwane nawet wtedy, gdy wskaźnik wskazuje go.A pointer cannot point to a reference or to a struct that contains references, because an object reference can be garbage collected even if a pointer is pointing to it. Moduł odśmiecania pamięci nie sprawdza, czy obiekt jest wskazywany przez jakiś wskaźnik.The garbage collector does not keep track of whether an object is being pointed to by any pointer types.

Wartość zmiennej wskaźnika typu myType* jest adresem zmiennej typu myType.The value of the pointer variable of type myType* is the address of a variable of type myType. Poniżej przedstawiono przykłady deklaracji typów wskaźnika:The following are examples of pointer type declarations:

PrzykładExample OpisDescription
int* p p jest wskaźnikiem do liczby całkowitej.p is a pointer to an integer.
int** p p jest wskaźnikiem do wskaźnika do liczby całkowitej.p is a pointer to a pointer to an integer.
int*[] p p to Jednowymiarowa tablica wskaźników do liczb całkowitych.p is a single-dimensional array of pointers to integers.
char* p p jest wskaźnikiem do znaku.p is a pointer to a char.
void* p p jest wskaźnikiem do nieznanego typu.p is a pointer to an unknown type.

Operatora pośredniego wskaźnika * można użyć w celu uzyskania dostępu do zawartości znajdującej się w lokalizacji wskazywanej przez zmienną wskaźnikową.The pointer indirection operator * can be used to access the contents at the location pointed to by the pointer variable. Na przykład przeanalizujmy następującą deklarację:For example, consider the following declaration:

int* myVariable;

Wyrażenie *myVariable oznacza zmienną int znalezioną pod adresem zawartym w myVariable.The expression *myVariable denotes the int variable found at the address contained in myVariable.

Kilka przykładów wskaźników znajduje się w tematach stałych instrukcja i konwersje wskaźnika.There are several examples of pointers in the topics fixed Statement and Pointer Conversions. Poniższy przykład używa słowa kluczowego unsafe i instrukcji fixed i pokazuje, jak zwiększyć wewnętrzny wskaźnik.The following example uses the unsafe keyword and the fixed statement, and shows how to increment an interior pointer. Ten kod można wkleić do funkcji Main aplikacji konsoli, aby go uruchomić.You can paste this code into the Main function of a console application to run it. Te przykłady muszą zostać skompilowane przy użyciu -niebezpiecznego zestawu opcji kompilatora.These examples must be compiled with the -unsafe compiler option set.

// Normal pointer to an object.
int[] a = new int[5] { 10, 20, 30, 40, 50 };
// Must be in unsafe code to use interior pointers.
unsafe
{
    // Must pin object on heap so that it doesn't move while using interior pointers.
    fixed (int* p = &a[0])
    {
        // p is pinned as well as object, so create another pointer to show incrementing it.
        int* p2 = p;
        Console.WriteLine(*p2);
        // Incrementing p2 bumps the pointer by four bytes due to its type ...
        p2 += 1;
        Console.WriteLine(*p2);
        p2 += 1;
        Console.WriteLine(*p2);
        Console.WriteLine("--------");
        Console.WriteLine(*p);
        // Dereferencing p and incrementing changes the value of a[0] ...
        *p += 1;
        Console.WriteLine(*p);
        *p += 1;
        Console.WriteLine(*p);
    }
}

Console.WriteLine("--------");
Console.WriteLine(a[0]);

/*
Output:
10
20
30
--------
10
11
12
--------
12
*/

Nie można zastosować operatora pośredni do wskaźnika typu void*.You cannot apply the indirection operator to a pointer of type void*. Można jednak użyć rzutowania, aby przekonwertować wskaźnik typu void na wskaźnik dowolnego innego typu i odwrotnie.However, you can use a cast to convert a void pointer to any other pointer type, and vice versa.

Wskaźnik może być null.A pointer can be null. Zastosowanie operatora pośredniego do wskaźnika o wartości null powoduje użycie zachowania zdefiniowanego w implementacji.Applying the indirection operator to a null pointer causes an implementation-defined behavior.

Przekazywanie wskaźników między metodami może spowodować niezdefiniowane zachowanie.Passing pointers between methods can cause undefined behavior. Rozważmy metodę, która zwraca wskaźnik do zmiennej lokalnej za pomocą in, outlub parametru ref lub jako wynik funkcji.Consider a method that returns a pointer to a local variable through an in, out, or ref parameter or as the function result. Jeśli wskaźnik został ustawiony w stałym bloku, wskazywana przez niego zmienna może już nie być stała.If the pointer was set in a fixed block, the variable to which it points may no longer be fixed.

W poniższej tabeli wymieniono operatory i instrukcje, które mogą wykonywać operacje na wskaźnikach w kontekście słowa kluczowego „unsafe”:The following table lists the operators and statements that can operate on pointers in an unsafe context:

Operator/instrukcjaOperator/Statement ZastosowanieUse
* Wykonuje operację wskaźnika pośredniego.Performs pointer indirection.
-> Uzyskuje dostęp do elementu członkowskiego struktury za pomocą wskaźnika.Accesses a member of a struct through a pointer.
[] Indeksuje wskaźnik.Indexes a pointer.
& Uzyskuje adres zmiennej.Obtains the address of a variable.
++ i --++ and -- Zwiększa i zmniejsza wartość wskaźnika.Increments and decrements pointers.
+ i -+ and - Wykonuje operacje arytmetyczne na wskaźniku.Performs pointer arithmetic.
==, !=, <, >, <=i >===, !=, <, >, <=, and >= Porównuje wskaźniki.Compares pointers.
operator stackallocstackalloc operator Przydziela pamięć na stosie.Allocates memory on the stack.
Instrukcja fixedfixed statement Tymczasowo ustala zmienną, dzięki czemu można znaleźć ten adres.Temporarily fixes a variable so that its address may be found.

Aby uzyskać więcej informacji na temat operatorów powiązanych ze wskaźnikiem, zobacz temat Operatory powiązane z wskaźnikiem.For more information about pointer related operators, see Pointer related operators.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz sekcję typy wskaźników C# specyfikacji języka.For more information, see the Pointer types section of the C# language specification.

Zobacz takżeSee also