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