un déréférencement de pointeur de tableau d'entiers
J'ai un pointeur de tableau d'entiers de 10. Ce qui devrait déréférencement du pointeur this me donner?
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?
}
OriginalL'auteur chappar | 2009-07-05
Vous devez vous connecter pour publier un commentaire.
Ce que vous déréférencer un pointeur vers un tableau. Ainsi, un déréférencement vous donne le tableau. Passage d'un tableau à printf (ou à n'importe quelle fonction) passe l'adresse du premier élément.
Vous dire
printf
que vous passiez ununsigned int
(%u
), mais en fait ce qui est passé est unint*
. Les chiffres que vous voyez sont les adresses du premier élément du tableau interprété comme un unsigned int.Bien sûr, c'est un comportement indéfini. Si vous souhaitez imprimer une adresse, vous devez utiliser
%p
et passer unvoid*
.<inttypes.h>
" et utiliser un format approprié élément, probablement PRIuPTR (dit-il, de travailler à partir de pâte feuilletée de la mémoire).litb, pouvez-vous m'expliquer ce que signifie "déréférencement vous donne la matrice"? Est-il encore pointeur de tableau? ou est-il à l'adresse du premier élément?
Il vous donne la même chose que juste le nom de "var" serait vous donner: Le tableau 🙂 Donc,
sizeof(*ptr) == 10*sizeof(int)
, et&*ptr == int(*)[10]
Pour passer le réel entiers, vous aurez à déréférencer deux fois:
**ptr
, ou plus verbeux(*ptr)[0]
pour le premier élément.J'ai trouvé ce fil me demandant pourquoi j'étais l'obtention de l'adresse quand j'ai pensé ptr[0] est un déréférencement du pointeur et ne sachant pas que c'était de passer le premier élément du tableau à la fonction printf. J'ai essayé les deux **ptr et (*ptr)[0] et j'ai reçu "Invalid argument de type de unaire" et "Indice de la valeur n'est ni tableau, ni pointeur." Est-il un autre moyen pour accéder à la valeur du tableau?
OriginalL'auteur Johannes Schaub - litb
Lorsque vous déclarez
une référence à
var
a type pointeur vers int (Lien vers la Faq C Pertinentes de l'article).Une référence à
&var
est un pointeur vers un tableau de 10 entiers.Votre déclaration
int (*ptr) [10]
, à juste titre, crée un pointeur sur un tableau de 10 entiers, à laquelle vous affectez&var
(l'adresse d'un pointeur sur un tableau de 10 entiers) (Lien vers la Faq C Pertinentes de l'article).Avec ces choses, espérons-le clairement,
ptr
serait alors imprimer l'adresse de base de la pointeur vers le tableau de 10 entiers.*ptr
serait ensuite imprimer le adresse du premier élément de le tableau de 10 entiers.Les deux dans ce cas sont à égalité, et c'est pourquoi vous voyez la même adresse.
Et oui,
**ptr would give you 1.
OriginalL'auteur Aditya Sehgal
Je suppose que cela pourrait apporter plus de clarté :
(Je suis juste à l'aide d'un extrait de code pour réduire l'encombrement)
Déclaration:
Indirection
Déréférencement
par conséquent, nous pouvons écrire:
REMARQUE: '<=====>' est juste un signe pour 'implique'. Rien de spécial!!!
Espérons que je ne me trompe pas??
OriginalL'auteur bluedroid