P - Dato Puntatore Flashcards
Cosa cambia tra Big e Little Endian?
- Big: MSB all’indirizzo di memoria più basso
- Little: LSB all’indirizzo di memoria più alto
Che differenza c’è tra un puntatore e un identificatore? Quindi quali “operazioni” supporta un dato puntatore e quali operatori?
Un identificatore è fisso mentre un puntatore È UN DATO e cioè è modificabile, calcolabile, assegnabile proprio perché è un dato. Gli operatori sono quelli di riferimento & e di dereferenziazione *
int n, *p;
n = 41; p = &n;
Quali sono le istruzioni per stampare il valore di n (2 modi), acquisire un valore in n (2 modi), stampare il valore del puntatore (e cioè?).
- printf(“%d”, n); e printf(“%d”, *p);
- scanf(“%d”, &n); e scanf(“%d”, p);
- printf(“%p”, p); -> indirizzo
In che libreria si trova NULL?
stdio.h
Che differenza c’è tra un puntatore come dato e come riferimento?
Un puntatore è usato come dato quando si vuole dare proprio al puntatore un valore, per esempio: p = &x;
Un puntatore è usato come riferimento quando attraverso di lui si vuole manipolare un altro dato, per esempio: p = 3(x+2);
Cosa si può dire degli incrementi p = p+i e p++ dove p è un puntatore?
L’incremento consiste in isizeof(p) ovvero non bisogna vedere i e 1 come numeri ma come quantità di dati del tipo di dato puntato, ovvero numero di dati da saltare.
Cosa sono il passaggio attuale e formale dei parametri?
Il parametro formale è quello che si trova nella definizione della funzione; quello attuale è quello che viene calcolato alla chiamata della funzione e poi effettivamente passato.
Quale tipo di passaggio supporta il linguaggio C? Descriverlo. Descrivere anche l’altro tipo realizzabile.
Supporta solo il passaggio by value nel quale il parametro attuale viene copiato nel formale.
Inoltre si può realizzare il passaggio by pointer: consiste in un passaggio by value di un puntatore.
A cosa corrisponde il nome del vettore?
Il nome del vettore è il puntatore al primo elemento del vettore stesso.
Mettere in corrispondenza biunivoca le seguenti notazioni:
- vet
- vet[i]
- *vet
- vet[0]
- *(vet + i)
- &vet[0]
- vet -> &vet[0]
- vet[I] -> *(vet + i)
- *vet -> vet[0]
Se dati + un vettore di interi, si può fare dati++ per passare all’elemento successivo? E dati + i?
La prima no perché dati è un nome e non è modificabile, la seconda sì.
Acquisizione da tastiera degli elementi del vettore dati[100].
Scrivere i tre modi: classico, con puntatore ma incrementando l’indice, con puntatore incrementando il puntatore.
1)
int dati[100], i;
…
for(i = 0; i < 100; i++) scanf(“%d”, &dati[i]);
2) int dati[100], i, *p; p = &dati[0] ... for(i = 0; i < 100; i++) scanf("%d", p+i); (oppure dati + i)
3) int dati[100], i, *p; p = &dati[0] ... for(i = 0; i < 100; p++, i++) scanf("%d", p);
Con la tecnica row-major per la scomposizione di matrici (NRxNC), a cosa corrisponde l’elemento mat[i][j]?
= (mat + NCI + j)
In cosa cambia l’utilizzo delle matrici come vettori di righe o come vettore di puntatori a riga?
Nulla, si usa sempre la notazione matriciale!
Qual è la dimensione di un puntatore?
32 o 64 bit