Usa la notazione e commerciale del puntatore in C
-
Usa la notazione
&var
per ottenere l’indirizzo di una variabile data -
Usa la notazione
*ptr
per accedere al valore della variabile dal puntatore -
Usa la notazione e commerciale
&
per passare l’indirizzo degli oggetti alle funzioni
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
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