Tipos de ponteiro (guia de programação C#)
Em um contexto não seguro, um tipo pode ser um tipo de ponteiro, um tipo de valor ou um tipo de referência. Uma declaração de tipo de ponteiro leva a uma das seguintes formas:
type* identifier;
void* identifier; //allowed but not recommended
Qualquer um dos seguintes tipos podem ser um tipo de ponteiro:
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool.
Qualquer enum tipo.
Qualquer tipo de ponteiro.
Qualquer tipo de struct definido pelo usuário que contém campos de somente os tipos de não gerenciados.
Tipos de ponteiro não herdam de objeto e não há conversões existem entre os tipos de ponteiro e object. Além disso, boxing e unboxing não suportam ponteiros. No entanto, você pode converter entre tipos diferentes de ponteiro e entre os tipos de ponteiro e integral.
Quando você declara vários ponteiros na mesma declaração, o * escritos em conjunto com o tipo subjacente apenas, não como um prefixo de nome de cada ponteiro. Por exemplo:
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
Um ponteiro não pode apontar para uma referência ou para uma struct que contém referências como uma referência de objeto pode ser lixo coletado, mesmo que um ponteiro esteja apontando para ele. O GC não controlar de se um objeto está sendo apontado por quaisquer tipos de ponteiro.
O valor da variável do tipo ponteiro myType* é o endereço de uma variável do tipo myType. A seguir é exemplos de declarações de tipo de ponteiro:
Exemplo |
Descrição |
---|---|
int* p |
p é um ponteiro para um inteiro. |
int** p |
p é um ponteiro para um ponteiro para um inteiro |
int*[] p |
p é uma matriz unidimensional de ponteiros para inteiros |
char* p |
p é um ponteiro para um char. |
void* p |
p é um ponteiro para um tipo desconhecido |
O operador de indireção ponteiro * pode ser usado para acessar o conteúdo no local apontado pela variável de ponteiro. Por exemplo, considere a seguinte declaração:
int* myVariable;
A expressão *myVariable indica o int variável encontrada no endereço contido na myVariable.
Não é possível aplicar o operador de indireção um ponteiro de tipo void*. No entanto, você pode usar uma conversão para converter um ponteiro nulo para qualquer outro tipo de ponteiro e vice-versa.
Um ponteiro pode ser null. Aplicar o operador de indireção para um ponteiro nulo faz com que um comportamento definidos na implementação.
Lembre-se de que a passagem de ponteiros entre métodos pode causar um comportamento indefinido. Exemplos são retornando um ponteiro para uma variável local por meio de Out ou Ref parâmetro ou como resultado da função. Se o ponteiro foi definido em um bloco fixo, a variável para o qual ele aponta não pode ser corrigida.
A tabela a seguir lista os operadores e instruções que podem operar em ponteiros em um contexto sem segurança:
Operador/instrução. |
Uso |
---|---|
* |
Executa indireção do ponteiro. |
-> |
Acessa um membro de um struct através de um ponteiro. |
[] |
Um ponteiro de indexados. |
& |
Obtém o endereço de uma variável. |
+ + e - |
Ponteiros incrementa e diminui. |
+ e - |
Efetua aritmética de ponteiro. |
= =,! =, <,> < =, e > = |
Compara os ponteiros. |
stackalloc |
Aloca memória na pilha. |
fixedinstrução |
Corrige temporariamente uma variável para que seu endereço pode ser encontrado. |
Especificação da linguagem C#
Para obter mais informações, consulte C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.
Consulte também
Referência
Unsafe Code and Pointers (C# Programming Guide)
Conversões de ponteiro (guia de programação de C#)
Expressões de ponteiro (guia de programação de C#)
fixed Statement (C# Reference)
Boxing e Unboxing (C# guia de programação)