C/Punteiros: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
Gallaecio (conversa | contribucións)
Revisión inicial...
Liña 1:
{{Navegador|ModificadoresEnumeracións|MatricesNomear tipos}}
 
{| align="right" style="margin-left: 1em;"
Os punteiros son un tipo de variables que non conteñen un valor ou valores, senón que conteñen un enderezo de memoria. Neste enderezo de memoria é onde residen os valores, mentres que o punteiro será simplemente un enderezo. Hai que aprender a traballar tanto co valor que contén o punteiro (o enderezo de memoria) como co valor do espazo de memoria sinalado polo punteiro.
| __TOC__
|} <!-- Isto sitúa o índice á dereita -->
 
Os punteiros son un tipo de variablesvariable que non conteñencontén un valor ou valores, senón que conteñen un enderezo de memoria. Neste enderezo de memoria é onde residen os valores, mentres que o punteiro será simplemente un enderezo. Hai que aprender a traballar tanto co valor que contén o punteiro (o enderezo de memoria) como co valor do espazo de memoria sinalado polo punteiro.
 
==Declaración==
Para declarar un punteiro, sitúase na declaración da variable un asterisco, ('''«<code>*</code>''')», entre o tipo de dato e mailo identificador da variable. A sintaxe fundamental da declaración dun punteiro é a seguinte:
<source lang=c>
tipo * identificador;
Liña 10 ⟶ 14:
 
Onde:
:'''<code>tipo</code>''' é o tipo de dato ao que sinala o punteiro.,
:'''<code>*</code>''' sinala que se trata dun punteiro., e
:'''<code>identificador</code>''' é o identificador (nome) do punteiro.
 
Liña 20 ⟶ 24:
 
===''Inicialización''===
Considérase unha boa práctica [[{{BASEPAGENAME}}/Variables#Inicializar variablesDeclaración|''inicializar'']] os punteiros co valor nulo (<code>NULL</code>) para que se saiba que non se reservou aínda espazo en memoria para o enderezo de memoria ao que sinala o punteiro. Isto ademais evita problemas con algunhas funcións, coma [[{{BASEPAGENAME}}/stdlib.h#realloc|<codesource lang=c enclose=none>realloc()</codesource>]], usada para traballar con memoria dinámica.
 
===Punteiro a un punteiro===
Liña 36 ⟶ 40:
 
===Tamaño===
O tamaño dos punteiros, o que ocupan en memoria, non ven dado polo tipo de dato especificado na [[{{PAGENAME}}#Declaración|declaración do punteiro]]. O tipo de dato da declaración corresponde ao tipo de dato ao que sinala o punteiro.
 
O verdadeiro tamaño do punteiro, posto que o punteiro garda un enderezo de memoria, dependerá da arquitectura do sistema operativo, xa que esta define a forma en que o procesador traballa coa memoria. Así, nun sistema de 32 bits, este será o tamaño do punteiro (32 bits = 4 bytes), e nun de 64 bits o tamaño será de 8 bytes.
 
===Traballar co valor sinalado===
Se queremos traballar ou asignarlle un valor ao espazo de memoria ao que sinala un punteiro (e non ao espazo de memoria que ocupa o punteiro), precédese o identificador do punteiro cun asterisco ('''<code>*</code>'''<ref name=operadores>Disto xa se falara no capítulo sobre [[{{BASEPAGENAME}}#Operadores#Operadores aritméticos|operadores]].</ref>). Véxanse os seguintes exemplos:
<source lang=c>
*punteiro = 0; // Asígnaselle o valor 0 ao espazo de memoria sinalado
Liña 48 ⟶ 52:
 
===Traballar cos enderezos doutras variables===
Mediante o símbolo '''«<code>&</code>'''<ref name=operadores />» pode obterse o enderezo de memoria dunha variable que non sexa un punteiro, o cal pode resultar moi útil á hora de traballar con punteiros. Véxase o seguinte exemplo:
<source lang=c>
// Declaramos unha variable de tipo int:
Liña 60 ⟶ 64:
punteiro = &variable;
 
// Agora "punteiro" sinala ao enderezo de memoria
// en que está gardada "variable".
</source>
 
Liña 67 ⟶ 71:
As [[{{BASEPAGENAME}}/Matrices|matrices]] non son máis que unha forma especial de traballar con punteiros. Unha matriz é en realidade un punteiro cuxo valor (o enderezo de memoria ao que sinala) non pode cambiar, e para o que se reserva un certo espazo en memoria estática ao declaralo ─que dependerá do tipo de datos e a cantidade deles que leve a matriz─.
 
Se se lle asigna a un punteiro "normal"“normal” o enderezo de memoria dunha matriz, poderase traballar co punteiro do mesmo xeito que se fai coa matriz.
 
===Matrices de punteiros===
Liña 75 ⟶ 79:
</source>
 
Isto será unha matriz con 66 celas, cada unha das cales é un punteiro a un dato de tipo carácter ([[{{BASEPAGENAME}}/Tipos fundamentais#char|<codesource lang=c enclose=none>char</codesource>]]).
 
===OperaciónsOperadores===
Hai certos operaciónsoperadores que presentan, para o noso ben, un comportamento lixeiramente distinto cos punteiros do que presentan con outro tipo de variables.
;*«<source lang=c enclose=none>punteiro--:++</source>» equivale a «<source lang=c enclose=none>punteiro = punteiro -+ sizeof(tipo)</source>».
 
;*«<source lang=c enclose=none>punteiro++:--</source>» equivale a «<source lang=c enclose=none>punteiro = punteiro +- sizeof(tipo)</source>».
;*«<source lang=c enclose=none>punteiro = punteiro + número:</source>» equivale a «<source lang=c enclose=none>punteiro = punteiro + número * sizeof(tipo)</source>».
 
;punteiro--:<source lang=c>punteiro = punteiro - sizeof(tipo)</source>
 
;punteiro = punteiro + número:<source lang=c>punteiro = punteiro + número * sizeof(tipo)</source>
 
Estes comportamentos especiais para punteiros permiten moverse comodamente por matrices de datos, etc.
 
:''Nota: Lémbreselémbrese que o "tipo"“tipo” é o tipo de dato da que sinala o punteiro, xa que o punteiro non ten un tipo definido.''
 
==Programa de resumo==
Liña 146 ⟶ 147:
==Notas==
<references />
 
==Véxase tamén==
===Outros capítulos===
*Funcións para traballar con memoria dinámica:
**[[{{BASEPAGENAME}}/malloc|<code>malloc()</code>]]
**[[{{BASEPAGENAME}}/realloc|<code>realloc()</code>]]
 
 
{{Navegador|ModificadoresEnumeracións|MatricesNomear tipos}}
 
<!-- Categorías: -->
[[Categoría:C ─ Tipos de datosVariables|Punteiros]]