Ici, j'ai un pointeur ptr
sur un tableau arr
de 4 entiers. ptr
pointe vers l'ensemble du tableau. ptr[0]
ou *ptr
pointe vers le premier élément du tableau, donc l'ajout de 1 ptr[0]
donne l'adresse du deuxième élément du tableau.
Je ne comprends pas pourquoi l'utilisation sizeof(ptr[0])
donne la taille de l'ensemble du tableau, 16 octets, pas la taille uniquement du premier élément, 4 octets (comme ptr[0]
pointe vers le premier élément du tableau).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? Cela indiquerait le début (premier élément) du tableau, ce qui équivaut à&arr[0]
.int *ptr = arr;
? En fait non.int (*ptr)[4]
créeptr
un pointeur vers un tableau complet de quatreint
valeurs. Une syntaxe de pointeur comme celle-ci est nécessaire pour allouer dynamiquement des tableaux multidimensionnels réels. Les "tableaux bidimensionnels" créés avec desmalloc()
boucles imbriquées et décrits à tort comme des tableaux multidimensionnels sont en réalité des tableaux 1-d de pointeurs vers plusieurs tableaux 1-d. Voir stackoverflow.com/questions/42094465/…Réponses:
Confusion de type.
ptr[0]
est un tableau.ptr
est un pointeur vers le tableau 4 d'int .ptr[0]
, comme*ptr
déférence le pointeur sur un tableau .sizeof(ptr[0])
est la taille d'un tableau.Avec
sizeof(ptr[0])
,ptr[0]
n'engendre pas "une expression de type" pointeur vers type "qui pointe vers l'élément initial de l'objet tableau" conversion. (c11dr §6.3.2.1 3). Avecsizeof
,ptr[0]
est un tableau.la source
&ptr[0][0]
a unint *
typeptr[0]
(converti implicitement enint *
) évaluerait l'adresse du premier élément int.printf("someforamt", ptr[0] , ptr[0]+1)
fait quelque chose de différent desizeof(ptr[0])
. Dansptr[0]
le premier cas passe par une conversion inplicite. Avecsizeof(ptr[0])
,ptr[0]
non.ptr
voici de typepointer to an array of 4 int elements
et le type de tableau a une taille 16 sur votre plateforme (sizeof (int) * (nombre d'elemetns)).parce que le système de type C a des types de tableau. Ici les deux
arr
et l'*ptr
a. Ce que vous déclarez avoir. Pour obtenir sizeof int ici, vous devez sizeof (ptr [0] [0]) - où ptr [0] est évalué en tableau.la source
avec
int (*ptr)[4] = &arr ;
vous avez un pointeur sur un tableau de quatre entiers et pointant sur arr.ptr
pointe maintenant versarr
, comme un double pointeur. Nous pouvons accéder à des éléments de l'arr
utilisationptr[0][x]
oùx
pourrait être0
à4
.C'est la
sizeof(ptr[0])
même chose quesizeof(arr)
la source
Par définition,
ptr[0]
est le même que celui*(ptr + 0)
qui à son tour est le même que*ptr
. De plus,ptr
est initialisé avec&arr
,*ptr
est ainsi*&arr
et c'est justearr
. Notez que le stockage intermédiaire&arr
enptr
ne pas effectuer une décroissance de tableau, de sorte que l'équivalence soit maintenue et aucune information de type est perdu.Notez que tout cela est calculé au moment de la compilation, juste pour éviter cet écueil supplémentaire.
la source