7
votes

Conversions standard: conversion de tableau-à-pointeur

C'est le point de ISO : conversions standard: conversion de tableau-à-pointeur: 4,2,1 $

Un lvalue ou rvalue de type "tableau de n t "ou" éventail de liaison inconnue de T "peut être converti en rvalue de type "pointeur à T." Le résultat est un pointeur sur le premier élément de le tableau.

Quelqu'un peut-il expliquer cela, si possible avec un exemple de programme.

J'ai déjà vu ces liens, mais je suis incapable de comprendre:

Array et Rvalue

Je pense que j'ai peut-être proposé un exemple de rvalue de type de tableau


0 commentaires

4 Réponses :


0
votes

Un exemple de ceci est que toute variable de matrice dégénérera automatiquement dans un pointeur sur son premier élément lorsqu'il est passé à une fonction qui prend un pointeur du type de la matrice.

Regardez cette section de la FAQ C-FAQ sur tableaux et pointeurs . Ceci est également applicable en C ++. P>

void foo(int *a) {
    a[0] = 1;
}

int main(void) {
    int b[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    foo(b);

    printf("b[0] == %d\n", b[0]);
}


0 commentaires

14
votes

en C et C ++, un tableau peut être utilisé comme s'il s'agissait d'un pointeur de son premier élément. Efficacement, donné une matrice nommée x code>, vous pouvez remplacer la plupart des utilisations de & x [0] code> avec juste x code>.

Voici comment l'abrégation est capable d'être utilisé avec des objets de tableau: p> xxx pré>

C'est également la manière dont une matrice peut être transmise à une fonction qui a un paramètre de type pointeur: P>

void f(int* p);

int x[5];
f(x);     // this is the same as f(&x[0])


4 commentaires

x [2] est identique à * (& x [0] + 2); Voulez-vous dire x + 2 est la même chose que & x [0] + 2? Il y a un problème définissant les indicatifs en termes de & x [0] (qui est également sous-dominant).


Un autre tel contexte est lorsque la matrice est liée à une référence à la matrice. Acclamations,


@Fred: Ugh, c'était vraiment mauvais; Merci de le pointer. En fait, je voulais dire (& x [0]) [2] , puisque je tentais de montrer l'équivalence entre x et & x [0] . Votre exemple fonctionnerait aussi, cependant.


@Alf: Merci de me rappeler le problème de référence-à-table. Il y a aussi le cas lorsqu'un littéral à chaîne (qui est un tableau) est utilisé comme initialisateur. Avons-nous manqué d'autres cas ou est-ce que tous?



2
votes
int a[6];
int *b = a;
Pointer b points to the a[0], i.e. contains the address of the element a[0].

0 commentaires

0
votes

Cela signifie que vous pouvez avoir la situation suivante: xxx pré>

Vous pouvez utiliser arr code> comme pointeur sur int code>, quels points au premier élément de la matrice, par exemple: p> xxx pré>

, puis le tableau sera le suivant: arr = {123, 666, ...} code > p>

En outre, vous pouvez transmettre la matrice à une fonction, qui prend INT *: P> xxx pré>

et appelez-le: p>

*( arr + 1 ) = 222;


1 commentaires

Ok, d'accord, édité. Enlevé la partie avec "Nom du tableau", mon mauvais.