Je viens de commencer à apprendre le C et le trouvé un peu de confusion sur le pointeur de la chaîne et de la chaîne(tableau de char). Quelqu'un peut-il m'aider à effacer de ma tête, un peu?
Voici la déclaration d'un tableau de pointeurs sur un entier: int *p[MAX]; Ceci déclare p comme un tableau de MAX pointeurs entiers. Ainsi, chaque élément de p contient maintenant un pointeur vers une valeur de type int. L'exemple suivant utilise trois entiers qui seront stockés dans un tableau de pointeurs comme suit: #include
09/12/2009, 14h02 #10 C'est dansgereux cela car le dernier élément d'un tableau de 10 éléments, c'est l'indice 9, pas 10 La valeur n'attend pas le nombre des années 09/12/2009, 14h05 #11 Je suis d'accod avec toi mais si n vaut 10 (donc un tableau de 11 cases), les 2 déclarations précédentes sont identiques? 09/12/2009, 14h07 #12 Si n vaut 10, tu as 10 cases dont les indices vont de 0 à 9 09/12/2009, 14h10 #13 Que dois je comprendre à cela puisque tu ne reponds pas à ma question??? 09/12/2009, 14h13 #14 Je ne cherchais pas forcément à répondre à ta question mais dans un bout de code que tu postes, il y a une faute et je tentais de te l'expliquer: sur un tableau de 10 éléments (char *monTab[10] = {NULL};) tu n'as pas le droit d'utiliser l'élément dont l'indice est 10 car il est hors du tableau 09/12/2009, 14h36 #15 Ben, non... new char [10], c'est un équivalent, plus complexe, de malloc(sizeof(char) * 10)). Ca va te chercher un bloc mémoire contigu de 10 élément libre et te retourner l'adresse du premier.
Cosider le code suivant: class Foo { Monster* monsters[6]; Foo() for (int i = 0; i < 6; i++) monsters[i] = new Monster();}} virtual ~Foo();} Quel est le bon destructeur? cette: Foo::~Foo() delete [] monsters;} ou ca: Foo::~Foo() delete monsters[i];}} J'ai actuellement le constructeur le plus élevé et tout fonctionne bien, mais bien sûr, je ne peux pas voir si cela fuit... Personnellement, je pense que la deuxième version est beaucoup plus logique compte tenu de ce que je fais. Quoi qu'il en soit, quelle est la "bonne" façon de procéder? delete[] monsters; Est incorrect car monsters n'est pas un pointeur vers un tableau alloué dynamiquement, il est un tableau de pointeurs. En tant que membre de classe, il sera détruit automatiquement lorsque l'instance de classe sera détruite. Votre autre implémentation est la bonne, car les pointeurs du tableau pointent vers des objets Monster alloués dynamiquement. Notez qu'avec votre stratégie d'allocation de mémoire actuelle, vous souhaiterez probablement déclarer votre propre constructeur de copie et votre opérateur d'affectation de copie afin que la copie non intentionnelle ne provoque pas de double suppression.
Cela représente une vue 2D dans notre esprit. Mais logiquement c'est un bloc mémoire continu.** = new *[ ]; entier **P = nouvel entier *[4]; Remarque: Le symbole *(astérisque) définit le niveau du pointeur, un * signifie un niveau de pointeurs, où ** implique deux niveaux de pointeurs, et ainsi de suite. De plus, le niveau du pointeur doit être le même que le tableau dimensionnel que vous souhaitez créer dynamiquement. Approcher: Créez un tableau 1D de pointeurs. Maintenant, créez la colonne en tant que tableau de pointeurs pour chaque ligne comme: P[0] = nouvel entier [3]; P[1] = nouvel entier [3]; P[2] = nouvel entier [3]; P[3] = nouvel entier [3]; Le tableau 1D de pointeurs pointe vers un bloc mémoire (la taille est mentionnée). Fondamentalement, P[0], …, P[3] pointent vers un tableau 1D d'entiers. Accéder aux éléments du tableau: *P est égal à P[0] qui est l'adresse de la 1ère ligne, la 1ère colonne est &P[0][0] = 3000. *(P + 1) est égal à ' P ' est 1000 + 1(sizeof int) = 1004 et * signifie déréférencement.
Maison À Vendre Hoymille, 2024