9
votes

Quel est le point des pointeurs vers des tableaux?

Alors, je lisais des pointeurs et je suis tombé sur le concept de pointeurs vers des tableaux. La chose est qu'un pointeur sur un tableau ne semble pas vraiment utile du tout, car au lieu d'utiliser un pointeur pour avoir un décalage pour accéder à un élément de tableau, je pouvais simplement obtenir l'élément directement. Cependant, je me sens comme si je manque de la raison pour laquelle ceux-ci peuvent être utiles.

Donc, en bref, quel est le point de pointe des tableaux; Comment et pourquoi devraient-ils être utilisés et avoir des applications pratiques? P>

EDIT: STROND> Je voulais dire cela dans le contexte des tableaux normaux / simples tels que: P>

int array[5];


15 commentaires

quel genre de tableaux? INT * MYARRAY = MALLOC (5 * Tailleof (int)); est une matrice aussi ...


@Liho, je voulais dire des tableaux simples, comme le tableau Int [5]; Je vais le modifier ..


Depuis quand 5 est contigu dans une matrice?


@Paulpro, c'est ce que la première définition d'un tableau que j'ai rencontré.


Ce que votre a écrit dans votre question est en effet un tableau. Ce que @Liho a dit n'est pas un tableau. Nommer le pointeur myarray ne fait pas un tableau.


Qu'est-ce que TailleOf (& Array) retourner?


@PaulPro: Syntaxiquement, ce n'est pas un tableau, mais il est sémantiquement.


Pas vraiment. Cela ressemble à un tableau sémantiquement mais pas pareil. Par exemple, la taille de l'opérateur rendra des résultats différents.


jeu de mots dans le titre?


@ClapTrap oui ... euh totalement intentionnel :)


La plupart de vos questions relatives à "pourquoi ...?" Peut être répondu par l'histoire de Dennis Richie de C cm.bell-labs.com/who /dmr/chist.html


Il y a une certaine confusion entre les pointeurs aux tableaux et les pointeurs vers des éléments de tableaux. Votre titre dit que vous avez posé des questions sur les pointeurs à des tableaux, par exemple Char (* PTR) [42] qui est un pointeur sur un réseau de 42 éléments de char . Est-ce votre intention ou posez-vous du pointeur à éléments de tableau, comme dans Char Array_Object [10]; Char * Not_an_Array_Pointer = Array_Object; ? En tout état de cause, les conseils de MFXM à lire la section 6 du Comp.lang.ca FAQ est excellent.


@LiHo: Vous avez écrit: " int * myarray = malloc (5 * taille de (int)); est un tableau aussi". Oui et non. L'appel MALLOC , s'il réussit, alloue de l'espace pour un réseau anonyme de 5 éléments de int . Mais myarray est un objet pointeur, de type int * . MyARRAY n'est en aucun cas un tableau. Il arrive simplement de pointer sur le premier élément d'un tableau.


Aucune des réponses n'a encore déclaré l'occurrence la plus courante des pointeurs à des tableaux. Considérez l'expression A [i] [j] , étant donné la déclaration int A [3] [3]; . Dans cette expression, A est automatiquement converti en un pointeur à une matrice de trois int , avant que le premier opérateur de l'indice n'est appliqué. Cela est nécessaire car l'opérateur de l'indice ne fonctionne que sur les pointeurs, pas sur des tableaux. Ainsi, les pointeurs vers des matrices sont automatiquement et invisibles dans des opérations de matrice normales.


@Keiththompson, le formor, je vais la modifier.


6 Réponses :


2
votes

Si vous avez un tableau de matrices, un pointeur sur un tableau devient utile, comme dans les suivants:

typedef float Point[3];
Point points[10];

Point *p;
for (p=points;p<points+10;++p) {
   ...
}


2 commentaires

Les points sont un tableau de 10 tableaux de 3 flotteurs. C'est donc un tableau de matrices. Si vous souhaitez itérer des points sur des points, vous utilisez un pointeur sur un tableau.


L'accès par index nécessite l'informatique une somme, l'accès par pointeur est légèrement plus efficace.



-1
votes

Celui que je peux penser à l'heure actuelle est (je suis sûr qu'il y en a d'autres aussi), vous souhaitez créer une matrice multidimensionnelle , Cependant, vous n'avez pas de données à Le moment pour enregistrer dans la 2e ou la 3ème dimension du tableau. Vous ne voulez pas perdre la mémoire en conservant l'espace pour la deuxième et la 3ème dimension du tableau mais vous envisagez d'attribuer la mémoire plus tard lorsque vous avez des données à stocker, c'est-à-dire lorsque les pointeurs vers des tableaux sont utiles.

par exemple. xxx

représentation du tableau 2D en C:

Ce site explique C'est assez bien. Cela devrait vous aider à supprimer des confusions.


7 commentaires

Juste pour être clair, la première ligne de code déclarant une gamme de pointeurs? Ou est-ce un pointeur à un tableau?


Le premier code, y compris, il suffit de montrer que vous pouvez représenter un tableau 2D comme celui-ci, il s'agit d'un pointeur du tableau. Dans le deuxième code, je affecte une mémoire pour la 2e dimension du tableau.


Bon alors, mais comment la représentation est-elle exacte à un travail de matrice 2D?


bien presque similaire au tableau 1D. Je ne peux pas l'expliquer en détail dans la section des commentaires, je suppose qu'il serait préférable de le chercher sur Bing / Google


Vous ne décrivez pas des tableaux multidimensionnels dans votre réponse, mais seulement une émulation d'une telle chose.


int * x [10]; ne déclare pas un pointeur à un tableau. Il déclare dix pointeurs à int . Un pointeur à un tableau serait int (* x) [10]; . Indépendamment desquels il déclare, en le suivant immédiatement par * x [i] = i * 2; utilise un pointeur non initialisé, entraînant un comportement non défini par la norme C. En plus de cela, dans aucun cas, il n'aurait le type int ** affiché dans le fichier ultérieur de malloc .


-1 Où est un pointeur pour la matrice ici? Qu'est-ce que x ? Si X est le pointeur sur le tableau pourquoi nous en avons besoin? Nous pouvons utiliser une seule gamme de pointeurs pour initialiser une éventail de pointeurs.



7
votes

Dans la plupart des expressions, un objet de type "matrice de t" se dégradera à l'adresse de la première édition de tableau, qui aura le type "pointeur à t". En ce sens, un type de pointeur peut être utilisé pour représenter un tableau d'éléments, et il est utilisé pour le faire lorsqu'il est nécessaire d'allouer de manière dynamique un tableau.

// ptr used to dynamically allocate 2 dimensional array [n][10] of T
T (*ptr)[10] = malloc(n * sizeof(*ptr));


0 commentaires

11
votes

Malheureusement, certaines réponses que vous avez reçues montrent des misses moulantes sur les pointeurs et les tableaux en C, en bref:

1) Le pointeur sur le tableau n'est pas le même que le pointeur au premier élément.

2) déclarant que le type de tableau n'est pas identique à la déclaration du pointeur.

Vous pouvez trouver une description complète dans C FAQ Partie liée à la confusion commune entre les pointeurs et les tableaux: http: //c-faq.com/aryptr/index.html

Adressant votre question - le pointeur au tableau est utile de transmettre une gamme complète de taille connue de la compilation et de conserver des informations sur sa taille lors de l'argument en passant. Il est également utile lorsque vous traitez avec des tableaux multidimensionnels lorsque vous devez opérer sur la sous-carrée d'un tableau.


4 commentaires

Droite, il y a tellement de bogus réponses, ici. Le seul qui l'amène au point que j'ai vu.


Je pense que l'exemple de ma réponse est d'accord avec celui-ci.


@MFXM question, car je ne peux pas sembler comprendre, comment un pointeur est-il différent d'un pointeur au premier élément et s'agit-il d'une façon différente de disposer du code de chacun ??


@Link in Breif, pointeur sur TRAY Points sur une matrice totale constituée d'éléments de type T, tandis que le pointeur sur T ne pointe que sur un objet spécifique de type T, ce qui peut faire partie du tableau ou de l'objet unique. Vous pouvez probablement mieux comprendre en comparant ce problème au pointeur pour structurer (contenant plusieurs membres, y compris INT) contre le pointeur à int. Bien que le pointeur de structure doit pointer sur une structure totale, le pointeur sur INT peut faire référence à ce membre de la structure, élément de tableau OT Just Int variable. Pensez à regarder C FAQ: C-FAQ.com/aryptr/ptrtoarray.html



5
votes

Les vrais pointeurs à des tableaux (qui n'ont pas été traités jusqu'à présent) sont rares car les matrices décrivent à un pointeur de leur premier élément dans la plupart des contextes et que des matrices sont contiguës en mémoire par définition qui est généralement tout ce qui est nécessaire. . Ils sont également un peu ambitieux que d'autres types de pointeur, car les types de matrices ne peuvent être attribués à. Ils sont similaires aux pointeurs de la fonction à cet égard.

La plus grande différence pratique vient du fait qu'ils préservent la taille de la matrice dans des situations dans lesquelles il serait autrement perdu de la désintégration du pointeur, tels que des appels de fonction et des retours. Prenez le code suivant par exemple P>

char (*function(void))[10] {
    static char array[10];
    // do something with our static array
    return &array;
}
char (*a)[10] = function();
// or even
char (*b)[sizeof(*function())] = function();


0 commentaires

1
votes

Voici un exemple du monde réel d'utiliser des pointeurs vers des tableaux: xxx

grâce à A et B des pointeurs que nous pouvons éviter de redondant Memcopies dans le cas de m1 et / ou m2 ne sont pas identiques que résultat


0 commentaires