2012-11-22 2 views

Répondre

4

Que diriez-vous ceci:

return & foo[i][j]; 
+0

qui était presque trop facile ... – Tyilo

2

Votre méthode est erroné:

*foo + i * b + j 

Ce déréférence le pointeur foo et ajoute quelque chose à sa valeur. Ce que vous voulez est:

foo + i * b + j 

Et puisque la notation d'index déréférence le pointeur aussi, vous devez référencer à nouveau:

&foo[i][j] 
+0

La méthode fonctionne pour moi: http://codepad.org/C7ytCw8J – Tyilo

+1

Bien sûr: 'foo' est un pointeur vers un pointeur sur int, donc quand il est déréférencé, c'est toujours un pointeur (vers int). Toujours ce codepad est faux: vous ne devriez pas jouer avec '[a] [b]'; Seules les valeurs '[0..a-1] [0..b-1]' sont dans la plage. – raina77ow

+1

@ raina77ow Non, 'foo' est un' int [10] [20] ', pas un' int ** ', et se désintègre en un int (*) [20]', un pointeur vers un tableau de 20 ' int', dans la plupart des contextes. Donc 'foo + i * b + j' produirait un int (*) [20]' à un octet-offset de '(i * b + j) * sizeof (int [20])' derrière le premier octet de 'foo' si' a' était assez grand (ce n'est pas le cas, sauf si 'i == 0' et' j' sont assez petits, ou si l'un des deux est négatif avec une magnitude appropriée, donc l'addition invoque un comportement indéfini en général). '* foo' d'un autre coté est un int [20]', et qui se désintègre dans la plupart des contextes en un 'int *', donc '* foo + i * b + j' fonctionne. –

Questions connexes