2012-11-29 4 views
1

Possible en double:
Is 2d array a double pointer?pointeur sur un tableau et double pointeur

void fun(int **ptr,int n) 
{ 
int i=0;j=0; 
for(i=0;i<n;i++) 
for(j=0;j<n;j++) 
printf("%d ",a[i][j]); 

} 

Int main() 
{ 
int arr[20][20]; 
int **ptr=arr; //Statement 1 
fun(arr,20); 
} 

Pourquoi déclaration 1 donne un avertissement et l'appel de fonction ne fonctionne pas? J'ai vu que c'est un cas exceptionnel dans les appels de fonction. Y a-t-il une raison derrière tout cela? Comment 'arr' un pointeur vers un tableau devient-il un double pointeur 'ptr' et nous pouvons quand même l'utiliser comme un pointeur vers un tableau? Merci d'avance. Pourquoi l'instruction 1 donne-t-elle un avertissement et que l'appel de la fonction ne l'est pas?

+0

Quel avertissement obtenez-vous? – jonhopkins

+0

S'il vous plaît faire plus de recherche, il y a littéralement des milliers de questions SO/manuels/articles expliquant cela. Commencez par K & R Le langage de programmation C. – djechlin

+1

Je ne me souviens pas d'avoir un 'Int' dans C. En dehors de cela, votre programme a plusieurs erreurs de syntaxe. Il ne compile pas. – ArjunShankar

Répondre

0

Il fait, après avoir fixé le code afin qu'il compile:

danger.c: In function ‘main’: 
danger.c:15:11: warning: initialization from incompatible pointer type [enabled by default] 
danger.c:16:1: warning: passing argument 1 of ‘fun’ from incompatible pointer type [enabled by default] 
danger.c:3:6: note: expected ‘int **’ but argument is of type ‘int (*)[20]’ 

et la raison de l'avertissement est bien expliqué (devrait être une erreur, l'OMI, mais gcc est très permissive). Vous passez un type de pointeur incompatible. Et cet avertissement arrive même avec le niveau d'avertissement par défaut.

2

Parce que int ** et int (*)[20] sont deux types fondamentalement différents. Pour ce dernier, la taille du tableau vers lequel il pointe est fixée au moment de la compilation.

Lorsque vous déréférencer un int ** vous vous attendez à trouver un int* - pointeur qui pointe vers un int. Lorsque vous déréférencer un int (*)[20] vous vous attendez à trouver un bloc de 20 int s, pas plus pointeurs.

Lorsque vous allouez int arr[20][20] alors arr est un symbole temps équivalent à la compilation int (*)[20], non int **. Si vous vouliez ce dernier, vous devrez allouer un int * arr[20] puis remplir les pointeurs vers un autre bloc de mémoire contenant int [20].