C - Pointeur + 1, Ce Qui Signifie
Ce que les codes essentiellement faire est d'imprimer l'adresse de chaque élément de l'int et des tableaux de char, souligné par des pointeurs i et ch.
#include<stdio.h>
int main()
{
char *ch;
int *i;
int ctr;
ch = malloc(sizeof(char)*10);
i = malloc(sizeof(int)*10);
printf("Index\ti Address\tch Address\n\n");
for(ctr=0; ctr<10; ctr++)
{
printf("%d\t%p\t%p\n",ctr,i+ctr,ch+ctr);
}
getch();
return 0;
}
Résultat:
Index i Address ch Address
0 00511068 00511050
1 0051106C 00511051
2 00511070 00511052
3 00511074 00511053
4 00511078 00511054
5 0051107C 00511055
6 00511080 00511056
7 00511084 00511057
8 00511088 00511058
9 0051108C 00511059
Je comprends que chaque élément dans les deux tableaux occupe l'espace de la taille de leur type de données. Mon problème est que je suis confus de cette opération:
i+1
Si i
est 00511068 , puis i+1
est 00511069
par opposition à la raison. Ce n' i+1
signifie? Comment avez-vous lu? Je pense que je ne comprends pas tout pointeur. Merci de m'aider à comprendre. Merci.
OriginalL'auteur dpp | 2011-10-25
Vous devez vous connecter pour publier un commentaire.
Ah, oui, ce vieux châtaignier. Il y a un peu de la magie qui se passe quand vous ajoutez de la N d'un pointeur; le compilateur comprend que vous voulez l'adresse de la n-ième élément, et multiplie les compenser par la taille du type de données.
Je n'appellerais pas ça "magique", c'est juste la manière de l'arithmétique sur les pointeurs est défini.
Il y a des fois je dirais que c'est gênant
OriginalL'auteur Phil Lello
C'est parce que
int
est de 4 octets sur ce système. Donc+1
sur un pointeur incrémenter par 4 au lieu de 1.Lorsque vous incrémenter un pointeur, vous l'incrémenter, de par leur taille réelle et non pas la valeur du pointeur lui-même.
i+1
? Comment avez-vous lu? Comment sait-il combien d'ajouter au lieu d'un seul?Une autre façon de le voir: en fait je+1, vous avez en fait d'incrémenter le pointeur sur la prochaine int -ce qui signifie que l'incrémentation de l'adresse de pointeur par 4 comme vous l'avez dit-. Cette opération est effectuée automatiquement par le compilateur. C'est pourquoi il existe des types. Ce n'est certainement pas étrange, mais très utile et logique.
Il connaît le type de données de je points à.
C'est pourquoi vous avez des pointeurs de types différents. En général, faire de l'arithmétique des pointeurs sur un
sometype *p
pointeur de décalages parsizeof(sometype)
, pas par1
.Merci pour le complément d'info. Je pensais à l'utilisation de type de données pour les pointeurs avant.
OriginalL'auteur Mysticial
pointer + j
est le même que&(pointer[j])
, de sorte que son l'adresse de la j-ème élément du tableau pointé parpointer
.De toute évidence, un pointeur vers un grand type de données sera incrémenté d'un pointeur sur un petit type de données.
OriginalL'auteur Klas Lindbäck