# Puntatori # Utilizzo Base dei Puntatori Scrivi un programma che utilizza un puntatore per leggere dallo standard input un numero intero inserito dall’utente. Il programma raddoppia il valore inserito dall’utente utilizzando il puntatore. Stampare, prima e dopo il raddoppio del valore, le seguenti informazioni: 1. Indirizzo della variabile puntata dal puntatore 2. Indirizzo della variabile a cui punta il puntatore 3. Valore della variabile 4. Valore della variabile a cui punta il puntatore ```c #include <stdio.h> int main(int argc, char* argv[]) { // Variabili int a, *pa; // Assegnamento del puntatore pa = &a; // Acquisizione del valore printf("Inserisci un intero: "); scanf("%d", pa); // Stampa info printf("Indirizzo variabile: %p\n", &a); printf("Indirizzo a cui punta il puntatore: %p\n", pa); printf("Valore variabile: %d\n", a); printf("Valore della variabile a cui punta il puntatore: %d\n", *pa); // Raddoppio del valore *pa = 2*(*pa); // Stampa info printf("Indirizzo variabile: %p\n", &a); printf("Indirizzo a cui punta il puntatore: %p\n", pa); printf("Valore variabile: %d\n", a); printf("Valore della variabile a cui punta il puntatore: %d\n", *pa); } ``` --- # Swap Scrivi un programma che implementa il meccanismo di `swap` tra due puntatori, che scambia i valori di due variabili intere usando i puntatori. Il programma dovrà: 1. Leggere due interi da input. 2. Usare il meccanismo di `swap` per scambiare i valori. 3. Stampare i valori prima e dopo lo scambio. ```c #include <stdio.h> int main(int argc, char* argv[]) { // Variabili int a, b, *pa, *pb, tmp; // Inizializzazione puntatori pa = &a; pb = &b; // Acquisizione valori printf("Inserisci il primo valore: "); scanf("%d", pa); printf("Inserisci il secondo valore: "); scanf("%d", pb); // Stampa info printf("Indirizzo prima variabile: %p\n", &a); printf("Indirizzo a cui punta il puntatore alla prima variabile: %p\n", pa); printf("Indirizzo seconda variabile: %p\n", &b); printf("Indirizzo a cui punta il puntatore alla seconda variabile: %p\n", pb); printf("Valore prima variabile: %d\n", a); printf("Valore della variabile a cui punta il primo puntatore: %d\n", *pa); printf("Valore seconda variabile: %d\n", b); printf("Valore della variabile a cui punta il seconda puntatore: %d\n", *pb); // Swap printf("\nSWAP!\n"); tmp = *pa; *pa = *pb; *pb = tmp; // Stampa info printf("Indirizzo prima variabile: %p\n", &a); printf("Indirizzo a cui punta il puntatore alla prima variabile: %p\n", pa); printf("Indirizzo seconda variabile: %p\n", &b); printf("Indirizzo a cui punta il puntatore alla seconda variabile: %p\n", pb); printf("Valore prima variabile: %d\n", a); printf("Valore della variabile a cui punta il primo puntatore: %d\n", *pa); printf("Valore seconda variabile: %d\n", b); printf("Valore della variabile a cui punta il seconda puntatore: %d\n", *pb); return 0; } ``` --- # Inserimento, Somma, Min e Max di un Array Scrivere un programma che dichiara un array di interi di 5 elementi e che usa un puntatore per: 1. Leggere i valori degli elementi dell’array dallo standard input 2. Sommare tutti gli elementi dell’array 3. Trovare il minimo valore dell’array 4. Trovare il massimo valore dell’array 5. Stampare la somma, il minimo e il massimo ## Versione Base ```c #include <stdio.h> #define N 5 int main(int argc, char* argv[]) { // Variabili int v[N], *pv, i, somma, min, max; // Inizializzazione puntatore pv = v; // Acquisizione valori for(i=0; i<N; i++){ printf("Inserisci l'elemento in posizione %d: ", i); scanf("%d", pv+i); } // Somma valori somma = 0; for(i=0; i<N; i++){ somma += *(pv+i); } // Trova minimo min = *pv; for(i=0; i<N; i++){ if(*(pv+i) < min) min = *(pv+i); } // Trova massimo max = *pv; for(i=0; i<N; i++){ if(*(pv+i) > max) max = *(pv+i); } // Stampa printf("Somma elementi: %d\n", somma); printf("MASSIMO: %d\n", max); printf("minimo: %d\n", min); return 0; } ``` ## Versione Ottimizzata ```c #include <stdio.h> #define N 5 int main(int argc, char* argv[]) { // Variabili int v[N], *pv, i, somma, min, max; // Inizializzazione puntatore pv = v; // Acquisizione valori somma = 0; for(i=0; i<N; i++){ printf("Inserisci l'elemento in posizione %d: ", i); scanf("%d", pv+i); if(i == 0){ max = *(pv+i); max = min; } else{ if(max < *(pv+i)) max = *(pv+i); if(min > *(pv+i)) min = *(pv+i); } somma += *(pv+i); } // Stampa printf("Somma elementi: %d\n", somma); printf("MASSIMO: %d\n", max); printf("minimo: %d\n", min); return 0; } ``` --- # Puntatori e Stringhe Scrivi un programma che chiede all'utente di inserire una stringa e poi: 1. Usa un puntatore per contare il numero di caratteri nella stringa (senza usare `strlen()`). 2. Usa il puntatore per stampare la stringa in ordine inverso. ```c #include <stdio.h> #define N 100 int main(int argc, char* argv[]) { // Variabili char stringa[N], *p_stringa; int i, len; // Inizializzazione puntatore p_stringa = stringa; // Acquisizione stringa printf("Inserire una stringa: "); scanf("%s", p_stringa); // Calcolo lunghezza len = 0; i = 0; while(*(p_stringa + i) != '\0'){ len++; i++; } // Stampa stringa in ordine inverso printf("Stringa invertita: "); for(i=len-1; i>=0; i--) printf("%c", *(p_stringa + i)); printf("\n"); return 0; } ``` --- # Somma di Matrici con Puntatori Scrivi un programma che esegue la somma di due matrici di interi di dimensione 3x3. Il programma dovrà: 1. Leggere le due matrici da input. 2. Usare puntatori per sommare gli elementi corrispondenti delle due matrici. 3. Stampare la matrice risultante dalla somma. ## Versione 1 ```c #include <stdio.h> #define N 3 int main(int argc, char* argv[]) { // Variabili int a[N][N], b[N][N], c[N][N], *pa, *pb, *pc, i, j; // Inizializzazione puntatori pa = &a[0][0]; // a[0]; pb = &b[0][0]; // b[0]; pc = &c[0][0]; // c[0]; // Acquisizione valori for(i=0; i<N; i++){ for (j=0; j<N; j++) { printf("Valore a[%d][%d]: ", i, j); scanf("%d", pa + i*N + j); } } for(i=0; i<N; i++){ for (j=0; j<N; j++) { printf("Valore b[%d][%d]: ", i, j); scanf("%d", pb + i*N + j); } } // Somma for(i=0; i<N; i++){ for (j=0; j<N; j++) { *(pc + i*N + j) = *(pa + i*N + j) + *(pb + i*N + j); } } // Stampa risultato printf("La somma tra le due matrici inserite è:\n"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ printf("%d ", *(pc + i*N + j)); } printf("\n"); } return 0; } ``` ## Versione 2 ```c #include <stdio.h> #define N 3 int main(int argc, char* argv[]) { // Variabili int a[N][N], b[N][N], c[N][N], (*pa)[N], (*pb)[N], (*pc)[N], i, j; // Inizializzazione puntatori pa = a; pb = b; pc = c; // Acquisizione valori for(i=0; i<N; i++){ for (j=0; j<N; j++) { printf("Valore a[%d][%d]: ", i, j); scanf("%d", *(pa + i) + j); } } for(i=0; i<N; i++){ for (j=0; j<N; j++) { printf("Valore b[%d][%d]: ", i, j); scanf("%d", *(pb + i) + j); } } // Somma for(i=0; i<N; i++){ for (j=0; j<N; j++) { *(*(pc + i) + j) = *(*(pa + i) + j) + *(*(pb + i) + j); } } // Stampa risultato printf("La somma tra le due matrici inserite è:\n"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ printf("%d ", *(*(pc + i) + j)); } printf("\n"); } return 0; } ```