Di seguito è riportato lo snippet di codice. Voglio sapere se il typecasting line no. 17
è valido e corretto in c?lancia il puntatore al puntatore a un array
#include <stdio.h>
typedef int twoInts[2];
void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);
int main() {
twoInts a;
a[0] = 0;
a[1] = 1;
print(&a);
intermediate(a);
return 0;
}
void intermediate(twoInts b) {
print((int(*)[])b); // <<< line no. 17 <<<
}
void print(twoInts *c){
printf("%d\n%d\n", (*c)[0], (*c)[1]);
}
Inoltre, quando cambio la definizione intermediate
a
void intermediate(twoInts b) {
print(&b);
}
sto ottenendo qui di seguito gli avvertimenti durante la compilazione e O/P non è corretta.
1.c:17:11: warning: passing argument 1 of print from incompatible pointer type
print(&b);
^
1.c:5:6: note: expected int (*)[2] but argument is of type int **
void print(twoInts *twoIntsPtr);
Come per la mia comprensione, array è in decomposizione a pointer to int
in discussione funtion. Qual è la ragione esatta?
Lasciatemi aggiungere: 'void print (twoInts * twoIntsPtr);' identico a: 'void print (int (* twoIntsPtr) [2]);' In altre parole, non nascondere array e puntatori dietro typedef. – this
La soluzione migliore e adeguata al problema, è infatti non nascondere mai una matrice dietro un typedef. Quindi potresti usare semplici puntatori "int *" senza la necessità di nascondere il programma all'oblio. – Lundin
Direi che 'print ((twoInts *) &b);' dovrebbe fare. – alk