Uso de la notación de puntero ampersand en C

Jinku Hu 12 octubre 2023
  1. Usar la notación &var para obtener la dirección de una variable dada
  2. Utilizar la notación *ptr para acceder al valor de una variable desde un puntero
  3. Usar la Notación Ampersand & para pasar la dirección de los objetos a las funciones
Uso de la notación de puntero ampersand en C

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C Pointer