Sdílet prostřednictvím


Typy ukazatelů (Průvodce programováním v C#)

V nezabezpečeném kontextu lze jako konkrétní typ použít typ ukazatele, typ hodnoty nebo typ odkazu.Deklarace typu ukazatele má jednu z následujících forem:

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

Typem ukazatele může být jakýkoli z následujících typů:

Typy ukazatelů nedědí z objektu a neexistuje žádná možnost převodu mezi typy ukazatele a objektem object.Dále není pro ukazatele k dispozici podpora zabalení a rozbalení.Můžete však převádět mezi různými typy ukazatele, nebo mezi různými typy ukazatele a integrálními typy.

Při deklaraci většího počtu ukazatelů ve stejné deklaraci je spolu se základním typem zapsán pouze symbol hvězdičky (*). Nepoužívá se jako předpona u názvů jednotlivých ukazatelů.Příklad:

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

Ukazatel nemůže odkazovat na odkaz nebo strukturu, která obsahuje odkazy, protože odkaz na objekt může být uvolněn z paměti i tehdy, pokud na něj ukazatel odkazuje.Systém uvolňování paměti neukládá přehled o tom, zda na konkrétní objekt neodkazují některé typy ukazatele.

Hodnota proměnné ukazatele typu myType* je adresa proměnné typu myType.Následují příklady deklarace typu ukazatele:

Příklad

Popis

int* p

p je ukazatel na celé číslo.

int** p

p je ukazatel na ukazatele na celé číslo.

int*[] p

p je jednorozměrné pole ukazatelů na celá čísla.

char* p

p je ukazatel na znak.

void* p

p je ukazatel na neznámý typ.

Operátor dereference ukazatele * lze použít pro přístup k obsahu v umístění, na které odkazuje proměnná ukazatele.Předpokládejme například následující deklaraci:

int* myVariable;

Výraz *myVariable označuje proměnnou int nalezenou v adrese obsažené v proměnné myVariable.

Témata fixed – příkaz (Referenční dokumentace jazyka C#) a Převody ukazatele (Průvodce programováním v C#) obsahují několik příkladů ukazatelů. Následující příklad znázorňuje nutnost klíčového slova unsafe a příkazu fixed a možnost zvýšení vnitřního ukazatele. Tento kód spustíte vložením do funkce Main konzolové aplikace. (Nezapomeňte povolit nezabezpečený kód v části Návrhář projektu: v panelu nabídek vyberte možnost Projekt a Vlastnosti a poté na kartě Sestavení vyberte příkaz Povolit nezabezpečený kód.)

// 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);
        // Deferencing 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]);
Console.ReadLine();

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

Operátor dereference nelze použít pro ukazatele typu void*.Můžete však použít přetypování neplatného ukazatele a převést jej na jiný typ ukazatele, a naopak.

Ukazatel může mít hodnotu null.Použití operátoru dereference na ukazatele null způsobí chování definované implementací.

Předávání ukazatelů mezi metodami může způsobit nedefinované chování.Příklady vrací ukazatele místní proměnné prostřednictvím parametru Ref nebo Out, nebo jako výsledek funkce.Pokud byl ukazatel nastaven v pevném bloku, pak proměnná, na kterou odkazuje, již nemusí být pevně stanovená.

V následující tabulce je uveden seznam operátorů a příkazů, které mohou fungovat u ukazatelů v nezabezpečeném kontextu:

Operátor/Příkaz

Použití

*

Provádí dereferenci ukazatele.

->

Zpřístupňuje člen struktury prostřednictvím ukazatele.

[]

Indexuje ukazatel.

&

Získá adresu proměnné.

++ a --

Zvýší a sníží ukazatele.

+ a -

Provádí aritmetické operace ukazatele.

==, !=, <, >, <= a >=

Porovnává ukazatele.

stackalloc

Přidělí paměť v zásobníku.

Příkaz fixed

Dočasně pevně stanoví proměnnou tak, aby bylo možné vyhledat její adresu.

Specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

Nezabezpečený kód a ukazatele (Průvodce programováním v C#)

Převody ukazatele (Průvodce programováním v C#)

Výrazy ukazatelů (Průvodce programováním v C#)

unsafe (Referenční dokumentace jazyka C#)

fixed – příkaz (Referenční dokumentace jazyka C#)

stackalloc (Referenční dokumentace jazyka C#)

Zabalení a rozbalení (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#

Další zdroje

Typy (Referenční dokumentace jazyka C#)