2009-08-20 9 views
2

La fonction CreateFileMapping renvoie un pointeur vers un fichier mappé en mémoire et je souhaite traiter ce mappage en tant que tableau.Conversion d'un pointeur en tableau en C++

Voici ce que je veux répéter:

char Array[] = (char*) CreateFileMapping(...); 

Sauf apparemment, je ne peux pas brandir simplement mes bras et déclarer qu'un pointeur est maintenant un tableau.

Est-ce que vous savez comment je peux faire ça? Je ne veux pas copier les valeurs que le pointeur pointe vers le tableau car cela nécessitera trop de mémoire avec des fichiers volumineux.

Merci un bouquet,

Répondre

22

Vous n'avez pas besoin. Vous pouvez indexer un pointeur comme s'il s'agissait d'un tableau:

char* p = (char*)CreateFileMapping(...); 
p[123] = 'x'; 
... 
+0

Génial, merci! –

+0

Notez qu'appeler sizeof() sur un tableau et un pointeur retournera des valeurs différentes. Le pointeur renverra la taille d'un pointeur, pas le tableau. Cela signifie que vous devrez envoyer la taille du tableau au lieu de faire le tour de la longueur du tableau. Vous pouvez créer un vrai pointeur vers un tableau en faisant 'char (* p) [] = ...' et ensuite obtenir les membres en utilisant '(* p) [123] = 'x'; encore obtenir la taille sans le passer le long. –

1

Mais comment le pointeur est-il différent du tableau? Quel est le problème avec

char *Array = (char*)CreateFileMapping(...);

Vous pouvez traiter les Array plus ou moins comme vous traiteriez un tableau à partir de maintenant.

+0

Il y a une différence. Un tableau peut avoir sizeof() appelé, mais un pointeur retournera la taille du pointeur, pas le tableau. Par conséquent, la longueur du bloc de données cible en mémoire n'est pas récupérable à partir d'un pointeur vers un tableau. Malheureusement il n'y a aucun moyen de convertir le pointeur vers un tableau en un vrai tableau sans la taille de ce tableau, mais alors vous n'aurez plus besoin de le convertir ... –

+0

@ user1884803, ouais, la question n'était pas quelle est la différence entre tableau et pointeur, mais quelle serait la différence dans ce contexte. –

5

En C/C++, les pointeurs et les tableaux ne sont pas la même chose.

Mais dans votre cas, pour vos objectifs ils sont.

Vous avez un pointeur.

Vous pouvez lui donner un indice.

E.g. un pointeur char * correspond au début de « bonjour »

pointeur [0] est le premier caractère « h »

pointeur

[1] est le deuxième caractère « e »

Il suffit donc de le traiter comme vous pensez à un tableau.

+2

Pour le langage, les pointeurs et les tableaux sont la même chose. Un tableau est un pointeur sur le premier objet d'une série. – user142350

+4

@ dnh828, vous avez tort. Essayez d'utiliser 'sizeof' sur un tableau et un pointeur du même type. Ou affectez un tableau à un autre. Un pointeur sur le tableau est également distinct du pointeur vers le pointeur. Etc. –

+8

Pour être plus précis, en C/C++, les tableaux _decay_ aux pointeurs _dans certains contextes_. Pas toujours. –

1

Vous pouvez utiliser un casting C-style:

char *p = (char*)CreateFileMapping(...); 
p[123] = 'x'; 

Ou la distribution de réinterpréter préféré:

char *p std::reinterpret_cast<char*>(CreateFileMapping(...)); 
p[123] = 'x'; 
2

"en C/C++, les pointeurs et les tableaux ne sont pas la même chose." est vrai, mais, le nom de la variable pour le tableau est le même que celui d'un pointeur const (cela vient de mon vieux livre noir Coriolis C++ si je me souviens bien). Pour savoir:

char carray[5]; 
char caarray2[5]; 
char* const cpc = carray; //can change contents pointed to, but not where it points 

/* 
    cpc = carray2; //NO!! compile error 
    carray = carray2; //NO!! compile error - same issue, different error message 
*/ 

cpc[3] = 'a'; //OK of course, why not. 

Espérons que cela aide.

+0

cpc [3] = 'a'; va donner une erreur .. est-il possible de faire le pointeur pour pointer vers une autre adresse .. – Angus

-1

Je cherchais aussi cette réponse. Ce que vous devez faire est de créer votre propre type de tableau.

static const int TickerSize = 1000000; 
    int TickerCount; 
    typedef char TickerVectorDef[TickerSize]; 

Vous pouvez également placer votre pointeur dans ce nouveau type. Sinon, vous obtenez "Erreur de compilation C2440". Il doit s'agir d'un tableau de taille fixe.Si vous l'utilisez uniquement comme pointeur, aucune mémoire réelle n'est allouée (sauf 4 à 8 octets pour le pointeur lui-même).