2009-12-22 4 views
1

j'ai réalisé que j'avais une certaine confusion quant à la valeur d'un pointeur déréférencé, comme je lisais un texte de C avec l'extrait de code suivant:Quelle est la valeur d'un pointeur déréférencé

int main() 
{ 
    int matrix[3][10];     // line 3: matrix is tentatively defined 
    int (* arrPtr)[10] = matrix;  // line 4: arrPtr is defined and initialize 
    (*arrPtr)[0] = 5;     // line 5: what is the value of (*arrPtr) ? 

Ma confusion est en ce qui concerne la valeur de * arrPtr dans la dernière ligne. C'est ma compréhension jusqu'à ce point.

Ligne 3, la matrice est le déclin (provisoirement défini) pour être un tableau de 3 éléments de type tableau de 10 éléments de type int.

Ligne 4, arrPtr est défini comme un pointeur vers un tableau de 10 éléments de type int. Il est également initialisé comme un ptr à un tableau de 10 éléments (c'est-à-dire la première rangée de matrice)

Maintenant Line 5, arrPtr est déréférencé, ce qui donne le tableau actuel, donc son type est un tableau de 10 ints.

Ma question: Pourquoi la valeur de la matrice, juste l'adresse de la matrice et pas en quelque sorte liée à ses éléments?

Répondre

1

La valeur du tableau de variables matrixest le tableau, mais il (facilement) « se dégrade » dans un pointeur sur son premier élément, que vous attribuez ensuite à arrPtr.

Pour voir cela, utilisez &matrix (a le type int (*)[3][10]) ou sizeof matrix (égal sizeof(int) * 3 * 10).

En outre, il n'y a rien de provisoire dans cette définition.

Edit: Je pas compris la question se cachant dans les commentaires de code: *arrPtr est un objet de type int[10], donc lorsque vous utilisez [0] dessus, vous obtenez le premier élément, auquel vous assignez ensuite 5.

Les pointeurs et les tableaux sont délibérément définis pour se comporter de manière similaire, ce qui est parfois déroutant (avant d'apprendre les diverses bizarreries), mais aussi extrêmement polyvalent et utile.

+0

Dans l'expression (* arrPtr) [0] = 5, étant donné que l'opérateur d'indice [] requiert un pointeur comme opérande. Est-ce que * arrPtr satisfait cette exigence? –

+0

'* arrPtr' est un tableau (arrPtr pointe sur un tableau et vous le déréférenciez), et vous pouvez utiliser un indice sur les tableaux. C appelle '[]' sous-indexation de tableau et ne nécessite qu'un seul opérande pour être un pointeur --- cependant, il repose sur les tableaux dégradants, voir 6.5.2.1/2 dans le standard C (qui le dit explicitement): http://www.open-std.org/jtc1/sc22/wg14/www/standards.html –

+0

En fait, l'exemple de 6.5.2.1/4 devrait également aider. –

0

Je pense que vous devez clarifier votre question. Si vous voulez dire quelle est la valeur de printf("%i", arrPtr); alors ce sera l'adresse du tableau. Si vous voulez dire printf("$i",(*arrPtr)[0]); alors nous avons une question plus charnue.

+0

S'agit-il d'un commentaire ou d'une réponse? –

+0

Je pensais que * arrPtr avait la même valeur dans les deux usages. Dans la seconde, l'indice [] requiert que le premier opérande soit un pointeur vers un type d'objet. Je pensais que "l'adresse du tableau" répondait à cette exigence. –

0

En C, les tableaux ne sont rien d'autre qu'une simple commodité. Toute une variable "tableau" est un pointeur vers le début d'un bloc de données; tout comme un int [] équivaut à un int*, à savoir l'emplacement en mémoire d'un int, un int [][] est un double pointeur, un int**, qui pointe vers l'emplacement en mémoire de ... un autre pointeur, qui à son tour pointe vers un particulier réel int.

+0

Non, c'est faux. As * function parameters * 'int []' et 'int *' sont équivalents (notez même pas 'const'), mais pas vrai pour int [] []' et 'int **' et tout autre utilisation de tableaux autres que les paramètres de fonction. –

+0

La seule différence que je connaisse entre ces formes s'applique lorsque les variables sont déclarées initialement. Lors de l'accès à un tableau, la notation par pointeur ('* (a + i * sizeof (int))', où 'a' a été déclaré comme un tableau de ints) est équivalente à' a [i] ', n'est-ce pas? –

+0

Faire de l'arithmétique sur une variable tableau dégrade le tableau en un pointeur (et sizeof il y a aussi faux, l'arithmétique du pointeur en prend soin). Cela fait partie de la conception de C, que les tableaux se dégradent facilement. Une variable tableau n'est toujours pas la même chose qu'un pointeur, voir les exemples '&' et 'sizeof' dans ma réponse. –

Questions connexes