Uso de la notación de puntero ampersand en C
-
Usar la notación
&var
para obtener la dirección de una variable dada -
Utilizar la notación
*ptr
para acceder al valor de una variable desde un puntero -
Usar la Notación Ampersand
&
para pasar la dirección de los objetos a las funciones
Este artículo introducirá múltiples métodos sobre cómo usar la notación del puntero ampersand en C.
Usar la notación &var
para obtener la dirección de una variable dada
Los punteros son simplemente variables que contienen las direcciones de memoria. Se declaran con la notación type *var
. Al puntero se le puede asignar cualquier dirección del mismo tipo, y cualquier tipo de puntero puede almacenar el puntero void*
, que se llama puntero genérico. Ya que tenemos un tipo que almacena las direcciones de los objetos, debe haber un operador que proporcione acceso a uno.
El símbolo ampersand &
se utiliza como operador unario, a menudo denominado operador address-of
. Se puede utilizar en objetos de datos y funciones para recuperar la dirección en la que está almacenado el objeto.
Supongamos que tenemos un entero x
declarado e inicializado como se muestra en el siguiente ejemplo. En ese caso, podemos tomar su dirección con el operador ampersand &
y asignarla a la variable int *xptr
. Como resultado, xptr
apunta al valor de 10233, y el operador *
puede ser utilizado para acceder a su valor en el código posterior.
Tenga en cuenta que el asterisco *
se utiliza en dos contextos diferentes aquí. Uno es para declarar una variable de tipo puntero. El otro es para acceder al valor de desde el puntero a la variable, lo que se denomina desreferenciación.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
printf("x: %d\n", x);
printf("*xptr: %d\n", *xptr);
exit(EXIT_SUCCESS);
}
Producción :
x: 10233
*xptr: 10233
Utilizar la notación *ptr
para acceder al valor de una variable desde un puntero
El operador de dereferencia puede ser utilizado para recuperar valores de los punteros y asignarlos a variables del mismo tipo. Tenga en cuenta que, el operador *
no puede ser utilizado con punteros null
o inválidos porque resulta en un comportamiento indefinido. En la mayoría de los escenarios, si uno intenta usar el puntero null
, el programa probablemente se bloqueará. Pero si se accede al puntero inválido, puede pasar desapercibido. Un puntero inválido puede apuntar a algún objeto arbitrario en memoria, y las operaciones sobre él seguirán adelante, pero puede dañar el estado del programa.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
int y = *xptr; // y now holds the value 10233
printf("x: %d\n", x);
printf("y: %d\n", y);
exit(EXIT_SUCCESS);
}
Producción :
x: 10233
y: 10233
Usar la Notación Ampersand &
para pasar la dirección de los objetos a las funciones
El ejemplo más común de utilizar el operador address-of es pasar un puntero al objeto como argumento de la función. El siguiente ejemplo demuestra la función swap
que toma dos punteros enteros como argumentos. Observa que cuando se llama a swap
desde la función main
, se utiliza el operador ampersand para pasar las direcciones de las variables x
e y
. Sin embargo, el operador *
en el cuerpo de la función swap
denota la desreferencia del puntero.
#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int x = 10233;
int y = 10133;
printf("x:%d, y:%d\n", x, y);
swap(&x, &y);
printf("x:%d, y:%d\n", x, y);
exit(EXIT_SUCCESS);
}
Producción :
x:10233, y:10133
x:10133, y:10233
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook