web-dev-qa-db-fra.com

Pointeur de casting sur Array (int * à int [2])

Comment convertir ou convertir un int * en int [x]?

Par exemple, j'ai essayé de convertir le pointeur int* c = new int[x] dans un tableau int b[2]

int b[2] = { 2, 3 };
int* c = new int[b[1]];

c[0] = b[0];
c[1] = b[1];
c[2] = a;

Tout d'abord, je sais que je peux parcourir le pointeur et le tableau. Convertissez donc le pointeur en un tableau avec des opérateurs [] pour indexer le pointeur et le tableau, en affectant les éléments de pointeur aux éléments de tableau sous forme d'itération (par exemple, arr[i] = p[i]). Je veux savoir si le même résultat peut être obtenu en moins de lignes de code.

J'ai essayé de résoudre le problème moi-même, alors j'ai créé un programme rapide pour être sûr de savoir exactement ce que j'essaie de mettre et où. La sortie est juste en dessous:

Address of {type: int} &a =             0031FEF4; a = 1
Address of {type: int[2]} &b =          0031FEE4; b = 0031FEE4
Address of {type: int[2]} &b[0] =       0031FEE4; b[0] = 2
Address of {type: int[2]} &b[1] =       0031FEE8; b[1] = 3
Address of {type: int*} &c =            0031FED8; c = 008428C8
Address of {type: int*} &c[0] =         008428C8; c[0] = 2
Address of {type: int*} &c[2] =         008428D0; c[2] = 1

Une fois que je me suis assuré de savoir où était le but, j'ai essayé plusieurs choses. La première idée qui me vint à l’esprit était d’obtenir l’adresse du second élément à l’allocation du pointeur, puis de remplacer l’adresse mémoire du tableau par celle-ci (voir le code ci-dessous). Tout ce que j'ai essayé a finalement échoué, généralement avec des erreurs de syntaxe.

C'est ce que j'ai essayé. Je veux vraiment que cela fonctionne, car ce serait la solution la plus simple.

b = &c[1];

Cela n'a pas fonctionné évidemment.

Edit: Solution: Ne le faites pas! Si c'est nécessaire créez un pointeur sur un tableau, puis pointez sur le tableau; c'est inutile pour tout ce que je peux comprendre ..__ Pour des informations plus détaillées, voir la réponse de Rodrigo ci-dessous.

17
Josh C

Tout d'abord, b est un tableau et non un pointeur. Il n'est donc pas assignable.

En outre, vous ne pouvez rien convertir en un type de tableau. Vous pouvez toutefois transtyper vers un pointeur vers un tableau . Notez qu'en C et C++, les pointeurs vers des tableaux sont plutôt rares. Il est presque toujours préférable d'utiliser des pointeurs simples ou des pointeurs à pointeurs et d'éviter le pointeur sur les tableaux.

Quoi qu'il en soit, ce que vous demandez peut être fait plus ou moins:

int (*c)[2] = (int(*)[2])new int[2];

Mais une typedef facilitera:

typedef int ai[2];
ai *c = (ai*)new int[2];

Et pour être sûr, la suppression doit être effectuée en utilisant le type d'origine:

delete [](int*)c;

Ce qui est bien si vous le faites juste pour le plaisir. Dans la vie réelle, il est généralement préférable d'utiliser std::vector.

22
rodrigo

Tout d’abord, le pointeur sur le tableau de style C est un très mauvais pratique en général.

Mais vous pouvez décomposer un tableau temporaire ("rvalue array") en adresse/pointeur. Il suffit d'écrire quelque chose comme ça

#include <stdio.h>

int main()
{
    int *array  = (int[2]){1, 2};
    printf("%d", array[0]); /* array[0] contains 1 now */

    return 0;
} 

Bien que je répète: quand vous le ferez, vous devriez avoir de bonnes raisons pour ce genre d’astuces. 

P.S. Le code énuméré ci-dessus est valable uniquement pour C99/C11 et non pour les compilateurs C++ modernes. 

0
Twissell