Usa la notazione e commerciale del puntatore in C

Jinku Hu 12 ottobre 2023
  1. Usa la notazione &var per ottenere l’indirizzo di una variabile data
  2. Usa la notazione *ptr per accedere al valore della variabile dal puntatore
  3. Usa la notazione e commerciale & per passare l’indirizzo degli oggetti alle funzioni
Usa la notazione e commerciale del puntatore in C

Questo articolo introdurrà più metodi su come utilizzare la notazione e commerciale del puntatore in C.

Usa la notazione &var per ottenere l’indirizzo di una variabile data

I puntatori sono semplicemente variabili che contengono gli indirizzi di memoria. Sono dichiarati con la notazione type *var. Al puntatore può essere assegnato qualsiasi indirizzo dello stesso tipo e qualsiasi tipo di puntatore può memorizzare il puntatore void*, che è chiamato puntatore generico. Poiché abbiamo un tipo che memorizza gli indirizzi degli oggetti, dovrebbe esserci un operatore che fornisce l’accesso a uno.

Il simbolo e commerciale & è usato come operatore unario spesso indicato come operatore indirizzo di. Può essere utilizzato su oggetti dati e funzioni per recuperare l’indirizzo in cui è memorizzato l’oggetto.

Supponiamo di avere un intero x dichiarato e inizializzato come mostrato nell’esempio seguente. In tal caso, possiamo prendere il suo indirizzo con l’operatore e commerciale & e assegnarlo alla variabile int *xptr. Di conseguenza, xptr punta al valore di 10233 e l’operatore * può essere utilizzato per accedere al suo valore nel codice successivo.

Notare che l’asterisco * viene utilizzato in due diversi contesti qui. Uno è dichiarare una variabile di tipo puntatore. L’altro è accedere al valore di dal puntatore alla variabile, quest’ultima chiamata dereferenziazione.

#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);
}

Produzione:

x: 10233
*xptr: 10233

Usa la notazione *ptr per accedere al valore della variabile dal puntatore

L’operatore di dereferenziazione può essere utilizzato per recuperare valori dai puntatori e assegnarli a variabili dello stesso tipo. Notare che l’operatore * non può essere utilizzato con puntatori null o non validi perché risulta in un comportamento indefinito. Nella maggior parte degli scenari, se si prova il puntatore null, è probabile che il programma vada in crash. Ma se si accede al puntatore non valido, potrebbe passare inosservato. Un puntatore non valido può puntare a qualche oggetto arbitrario in memoria e le operazioni su di esso continueranno comunque, ma potrebbe danneggiare la correttezza dello stato del programma.

#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);
}

Produzione:

x: 10233
y: 10233

Usa la notazione e commerciale & per passare l’indirizzo degli oggetti alle funzioni

L’esempio più comune di utilizzo dell’operatore address-of consiste nel passare un puntatore all’oggetto come argomento della funzione. L’esempio seguente mostra la funzione swap che accetta due puntatori interi come argomenti. Si noti che quando lo swap viene chiamato dalla funzione main, l’operatore e commerciale viene utilizzato per passare gli indirizzi delle variabili x e y. Attenzione però, l’operatore * nel corpo della funzione swap denota la dereferenziazione del puntatore.

#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);
}

Produzione:

x:10233, y:10133
x:10133, y:10233
Autore: 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

Articolo correlato - C Pointer