C/Punteiros: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
mSen resumo de edición
Gallaecio (conversa | contribucións)
Engasdo o código fonte dun programa que resume a explicación do concepto de "punteiro".
Liña 1:
{{Navegador|Cadeas de caracteres|Tipos de datos estruturados}}
 
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.
 
==Declaración de punteiros==
Liña 12 ⟶ 14:
O valor nulo nos punteiros escríbese <code>NULL</code>, non <code>0</code>.
 
==Traballo co valor apuntado==
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>'''). Véxanse os seguintes exemplos:
<source lang=c>
Liña 18 ⟶ 19:
resultado = *punteiro_ao_primeiro_operando + *punteiro_ao_segundo_operando;
</source>
 
==Programa de resumo==
Cómpre comprender por riba o funcionamento do seguinte código, que amosa claramente o principio do funcionamento dos punteiros.
<source lang=c>
// Ficheiros de cabeceira
#include <stdio.h>
// Para utilizar:
// printf()
#include <stdlib.h>
// Para usar:
// free()
// malloc()
 
// FUNCIÓN PRINCIPAL
int main(void)
{
// Declaración de variables
int * punteiro;
// Facémoslle espazo en memoria ao enteiro...
punteiro = (int *) malloc(sizeof(int));
// Operacións
*punteiro = 666; // Ao "int" ao que sinala en memoria o punteiro dámoslle o valor 666.
// Impresións en pantalla dos datos interesantes
printf("Punteiro:\n");
printf("\tValor:\t\t%p\n",punteiro); // Valor do punteiro, un enderezo de memoria
printf("\tEnderezo:\t\t%p\n",&punteiro); // Enderezo de memoria en que se garda o punteiro
printf("\tTamaño:\t\t%d bytes\n",sizeof(punteiro));
printf("Espazo de memoria apuntado:\n");
printf("\tValor:\t\t%d\n",*punteiro); // Valor ao que sinala o punteiro
printf("\tEnderezo:\t\t%p\n",&(*punteiro)); // Enderezo, que debería coincidir co valor do punteiro
printf("\tTamaño:\t\t%d bytes\n",sizeof(*punteiro));
// Liberamos a memoria reservada para o punteiro (este paso é obrigatorio)
free(punteiro);
}
</source>
 
O programa debería permitirnos comprender a diferencia entre o punteiro e o dato ao que apunta. Cómpre [[{{BASEPAGENAME}}/Editar un programa|copiar o código nun ficheiro de texto]], [[{{BASEPAGENAME}}/Compilar un programa|compilalo]] e [[{{BASEPAGENAME}}/Executar un programa|executalo]]. Un posible resultado sería o seguinte:
<pre>
Punteiro:
Valor: 0x1104010
Enderezo: 0x7fff9f9b42e8
Tamaño: 8 bytes
Espazo de memoria apuntado:
Valor: 666
Enderezo: 0x1104010
Tamaño: 4 bytes
</pre>