Plus de deux pointeurs en c ou en c++ pas pris en charge. pourquoi?
Pourquoi plus de deux pointeurs sont pas pris en charge en c ou c++.
Quand je le fais,
int *ptr,*ptr1;
int sum = ptr + ptr1;
C ou C++ renvoie une erreur. Tandis qu'il soutient,
int diff = ptr - ptr1;
Posez-vous la question, comment ajouter des pointeurs être d'une vraie utilité en opposition à la soustraction?
Qu'attendez-vous de la somme est pointée? Ce n'est probablement pas pris en charge car il n'est pas utile (et potentiellement une source de bugs)
Pensez-y de cette façon. En soustrayant le nombre d'une maison dans une rue à partir d'un autre numéro de maison dans la rue vous donne le nombre de maisons d'entre eux (plus un. j'.e #2 - #1 = 1 = 0 + 1). Pourtant, si vous ajoutez le numéro d'une maison à l'autre, qu'est-ce exactement avez-vous? Vous pouvez penser à des pointeurs comme des numéros de maison. Le nombre lui-même est pratiquement vide de sens - c'est seulement un moyen de trouver une maison particulière, ou, dans le cas des pointeurs - il un moyen de remédier à une pièce particulière de la mémoire.
Bien sûr, qui peut être réalisé sans pointeur de plus
Heureusement, nous sommes de programmation et de ne pas faire des mathématiques! 😉
Qu'attendez-vous de la somme est pointée? Ce n'est probablement pas pris en charge car il n'est pas utile (et potentiellement une source de bugs)
Pensez-y de cette façon. En soustrayant le nombre d'une maison dans une rue à partir d'un autre numéro de maison dans la rue vous donne le nombre de maisons d'entre eux (plus un. j'.e #2 - #1 = 1 = 0 + 1). Pourtant, si vous ajoutez le numéro d'une maison à l'autre, qu'est-ce exactement avez-vous? Vous pouvez penser à des pointeurs comme des numéros de maison. Le nombre lui-même est pratiquement vide de sens - c'est seulement un moyen de trouver une maison particulière, ou, dans le cas des pointeurs - il un moyen de remédier à une pièce particulière de la mémoire.
Bien sûr, qui peut être réalisé sans pointeur de plus
middle = begin + (end-begin)/2
Heureusement, nous sommes de programmation et de ne pas faire des mathématiques! 😉
OriginalL'auteur vignesh babu | 2014-09-04
Vous devez vous connecter pour publier un commentaire.
Pointeurs contiennent des adresses. L'ajout de deux adresses n'ont pas de sens, parce que vous n'avez aucune idée de ce que vous pointez. Soustraction de deux adresses vous permet de calculer le décalage entre ces deux adresses, ce qui peut être très utile dans certaines situations.
Edit: Pour répondre à la volonté commune de trouver le milieu de considérer ce (à titre d'exemple):
Je suis sûr que vous pouvez toujours venir avec un décalage de calcul qui permet de faire ce que vous voulez atteindre avec plus.
OriginalL'auteur midor
Pour le dire clairement, la différence entre deux pointeurs de donner le nombre d'éléments du type qui peuvent être stockées entre les deux pointeurs, mais en les ajoutant ne pas tout donner tout sens de la fonctionnalité.
Si il n'y a pas de véritable fonctionnalité ne semble-t-il un sens qu'il n'est pas pris en charge.
OriginalL'auteur DevonHorizon
L'ajout de deux adresses peut effectivement être utile, Vous pouvez avoir besoin de connaître le moyen d'adresse entre deux adresses par exemple (a+b)/2 ( pour les gars qui veulent penser à des pointeurs comme des numéros de maison, ce serait de lui donner le numéro de la maison dans le milieu, entre les deux maisons ), je pense que l'ajout de deux adresses doivent être autorisés parce que vous pouvez le faire de toute façon à l'aide de moulages :
EDIT : je ne dis pas que l'utilisation d'ajout d'adresses est obligatoire dans certains cas, mais il peut être utile lorsque l'on sait comment l'utiliser.
En supposant que la mémoire contiguë (par exemple un tableau), Il serait probablement plus sûr de faire de même "milieu" adresse de calcul avec
int *ptr2 = ptr + ((ptr - ptr1) / 2)
, comme il peut être moins sensible à un débordement dans les systèmes où la mémoire a atteint ses limites physiques basés sur la taille du pointeur (par exemple ~4 GO sur les systèmes 32 bit). Il est également sensible à donner mal alignées pointeurs (par exemple, trouver le milieu entre entiers de 4 octets à0x1000
et0x100C
, résultant en0x1006
au lieu de0x1004
ou0x1008
)Ne lancez pas des pointeurs vers
int
, qui est fondamentalement mauvais, car ils peuvent avoir différentes largeur. Les types d'entiers en C pour de telles manipulations sontuintptr_t
etintptr_t
.Comme je l'ai dit dans mon EDIT, cela pourrait être utile pour ceux qui savent comment l'utiliser !! @Serge x + (x-y)/2 n'est pas le milieu de [x,y] (il n'est même pas inclus dans [x,y], mais je pense que vous vouliez dire, x + (y-x)/2 et c'est égal à (x+y)/2.
oui, c'est-à-dire
x + (y - x)/2
OriginalL'auteur Othman Benchekroun