2009-07-05 6 views
11

J'ai un pointeur sur un tableau d'entiers de 10. Que devrait me donner le déréférencement de ce pointeur?pointeur de déréférencement vers un tableau d'entiers

Par exemple:

#include<stdio.h> 

main() 
{ 
    int var[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int (*ptr) [10] = &var; 

    printf("value = %u %u\n",*ptr,ptr); //both print 2359104. Shouldn't *ptr print 1? 


} 

Répondre

15

Ce que vous déréférencer un pointeur sur un tableau. Ainsi, le déréférencement vous donne le tableau. Passer un tableau à printf (ou à toute fonction) passe l'adresse du premier élément.

Vous dites printf que vous passez un unsigned int (%u), mais en fait ce qui est passé est un int*. Les nombres que vous voyez sont les adresses du premier élément du tableau interprété comme un entier non signé.

Bien sûr, ce comportement n'est pas défini. Si vous souhaitez imprimer une adresse, vous devez utiliser %p et passer un void*.

+0

Ou vous pouvez convertir un type entier approprié - comme uintptr_t de '' '' et utiliser un élément de format approprié, probablement PRIuPTR (il dit, travaillant à partir d'une mémoire flaky). –

+0

Litb, pouvez-vous m'expliquer ce que signifie "déréférencement vous donne le tableau"? Est-ce encore un pointeur sur le tableau? ou est-ce l'adresse du premier élément? – chappar

+0

Il vous donne la même chose que juste nommer "var" vous donnerait: Le tableau :) Ainsi, 'sizeof (* ptr) == 10 * sizeof (int)', et '& * ptr == int (*) [ 10] ' –

10

Lorsque vous déclarez

int var[10]; 

une référence à var est de type pointeur int(Link to C Faq Relevant's section).

Une référence à &var est un pointeur sur un tableau de 10 ints.

Votre déclaration int (*ptr) [10] crée à juste titre un pointeur sur un tableau de 10 ints auquel vous attribuez &var (l'adresse d'un pointeur sur un tableau de 10 ints) (Link to C Faq Relevant's section).

Avec ces éléments, espérons-le, ptr imprime alors l'adresse de base du pointeur sur le tableau de 10 ints.

*ptr imprimera alors l'adresse du premier élément de le tableau de 10 ints.

Les deux sont dans ce cas égaux et c'est pourquoi vous voyez la même adresse.

Et oui, **ptr would give you 1.

+0

bien sûr, il serait imprimer correctement si vous suivez les conseils de litb. Utilisez (void *) et% p lors de l'impression d'adresses. –

-1

Je suppose que cela pourrait apporter plus de clarté:

(je suis juste en utilisant un bout de code pour réduire l'encombrement)

Déclaration:

int a[5]; 
a[5] = {0,1,2,3,4); 

Indirection

ptr = a <======> ptr = &a[0] 

Déréférencer

*ptr = *a <======> *ptr = *&a[0] 
        *ptr = a[0] 

donc, nous pouvons écrire:

*(ptr + i) = *(a + i) <======> *(ptr + i) = a[i] 

REMARQUE: '< =====>' est juste un signe pour « implique '. Rien de spécial!!! J'espère que je ne me trompe pas ??

Questions connexes