Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1786 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Les valeurs vont de 4 en 4?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Les valeurs vont de 4 en 4?

n°1980762
lassault1
Posté le 04-04-2010 à 13:29:30  profilanswer
 

Pourquoi dans un tableau "int" les adresses des valeurs vont de 4 en 4?

mood
Publicité
Posté le 04-04-2010 à 13:29:30  profilanswer
 

n°1980764
Elmoricq
Modérateur
Posté le 04-04-2010 à 13:33:33  profilanswer
 

sizeof int

n°1980765
Profil sup​primé
Posté le 04-04-2010 à 13:37:18  answer
 

In octet or in word ?

n°1980770
lassault1
Posté le 04-04-2010 à 14:03:08  profilanswer
 

c'est quoi sizeof int ?

 

Ce que je comprends pas ce que dans le tuto il est dit : [B]chaque case mémoire contient un octet c'est-à-dire huit bits[/B] donc j'en conclus qu'un "int" (4 octets) contient 4 cases et c'est la 1ere cases qui contient l'adresse et c'est pour cela que les adresse vont de 4 en 4..

 

C'est ça ou pas?


Message édité par lassault1 le 04-04-2010 à 14:11:59
n°1980783
Elmoricq
Modérateur
Posté le 04-04-2010 à 15:01:51  profilanswer
 

Non.

 

Soit a l'adresse de départ.
Pour avoir l'adresse au premier élément, d'indice 0, tu vas le récupérer à l'adresse : a + 0 * sizeof int, donc à l'adresse a.
Le second élément, d'indice 1, se situe à l'adresse a + 1 * sizeof int, donc a+4 sur ta machine+ton compilateur (attention : sizeof int varie selon les architectures et les implémentations).
Etc.

 

Donc, pour accéder à l'élément i, tu vas le chercher à l'adresse :
a + i * sizeof int
C'est exactement ce que fait la syntaxe : a[ i ].

 

Un "tableau" ne connait donc que deux informations : son adresse de départ, et le type d'éléments stockés (ici, "int", ce qui permet de faire "sizeof int" et donc de savoir combien de bytes prend un élément).
C'est pourquoi en C, le nombre d'éléments doit être conservé à part, aucune sécurité n'empêchant d'accéder à un élément d'indice arbitrairement grand, et dépassant la capacité de stockage de ton tableau.


Message édité par Elmoricq le 04-04-2010 à 15:04:19
n°1980790
lassault1
Posté le 04-04-2010 à 15:34:58  profilanswer
 

Merci mais j'ai pas compris.. et oui c'est pas facile d'être débutant..
 
Peut tu inexpliqué plus facilement ?
 
Merci d'avance...

n°1980808
Elmoricq
Modérateur
Posté le 04-04-2010 à 16:58:47  profilanswer
 

Ton adresse va de 4 en 4 parce qu'il faut 4 bytes pour stocker un int (encore une fois, sur TON architecture actuelle).

 

Un tableau, c'est juste une adresse de début, et un type de données.
Pour accéder à une donnée à l'indice i, il faut ajouter i * la taille d'une donnée à l'adresse de début pour y accéder.

 

Tiens, un petit code écrit à l'arrache, pour te montrer :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int a[] = {13, 42, 27, 53, 34};
  7.    const unsigned aSize = sizeof(a) / sizeof(int);
  8.  
  9.    for(unsigned i = 0; i  < aSize; ++i)
  10.        printf("Elément %d : %d\n", i, *(int*)((void*)a + i * sizeof(int)));
  11.  
  12.    return 0;
  13. }
 

Ce qui nous donne bien :

Elément 0 : 13
Elément 1 : 42
Elément 2 : 27
Elément 3 : 53
Elément 4 : 34

 


Et schématiquement, ça donne ça :


|----13----|----42----|----27----|----53----|----34----|
^          ^          ^          ^
a          |  a + 1 * sizeof int |
   a+ 0 * sizeof int    a + 2 * sizeof int


Message édité par Elmoricq le 04-04-2010 à 17:08:36
n°1981065
Kenelm
Posté le 06-04-2010 à 09:59:45  profilanswer
 

En plus court : une adresse pointe sur un octet, un int fait 4 octets, dont les ints se trouvent tous les 4 octets, donc les adresses de ceux si vont de 4 en 4.

n°1981080
gilou
Modérateur
Modzilla
Posté le 06-04-2010 à 10:21:42  profilanswer
 

Kenelm a écrit :

En plus court : une adresse pointe sur un octet

C'est un pointeur qui pointe.
Soit p un pointeur. p vaut une certaine valeur, qui est une adresse, celle de ce qui est pointé par p.
Si p est un pointeur sur des char, p+1 a pour valeur la valeur de p plus 1, car la taille de d'un char est 1 (octet). Bref, p+1 pointe sur le char suivant celui pointé par p, et comme la taille d'un char est 1, l'adresse de ce char suivant est l'adresse du char pointé par p, plus 1.
Si p est un pointeur sur des int, p+1 a pour valeur la valeur de p plus 4, car la taille de d'un int est 4 (octets). Bref, p+1 pointe sur l'int suivant celui pointé par p, et comme la taille d'un int est 4, l'adresse de cet int suivant est l'adresse de l'int pointé par p, plus 4.  
Attention a ne pas se faire avoir par l'écriture: p+1 ne vaut pas nécessairement la valeur de p (ie l'adresse de ce qui est pointé par p) auquel on ajoute 1. p+1, c'est l'adresse de ce qui est juste après ce qui est pointé par p. Donc ca dépend de la taille de ce qui est pointé par p.
Quand le compilo voit une déclaration X* p; et que plus tard, il voit p+n, il remplace en interne l'expression p+1 par la valeur p+n*sizeof(X) pour avoir la valeur de l'adresse
A+,

Message cité 2 fois
Message édité par gilou le 06-04-2010 à 10:25:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1981103
Elmoricq
Modérateur
Posté le 06-04-2010 à 10:41:40  profilanswer
 

gilou a écrit :


Quand le compilo voit une déclaration X* p; et que plus tard, il voit p+n, il remplace en interne l'expression p+1 par la valeur p+n*sizeof(X) pour avoir la valeur de l'adresse
A+,

 

Illustré, dans le bout de code ci-dessus, par le cast de mon tableau en "void*" pour pouvoir faire mon addition d'adresse (j'aurais dû le préciser) :jap:


Message édité par Elmoricq le 06-04-2010 à 10:42:21
mood
Publicité
Posté le 06-04-2010 à 10:41:40  profilanswer
 

n°1981124
Kenelm
Posté le 06-04-2010 à 11:03:58  profilanswer
 

gilou a écrit :

C'est un pointeur qui pointe.
Soit p un pointeur. p vaut une certaine valeur, qui est une adresse, celle de ce qui est pointé par p.
Si p est un pointeur sur des char, p+1 a pour valeur la valeur de p plus 1, car la taille de d'un char est 1 (octet). Bref, p+1 pointe sur le char suivant celui pointé par p, et comme la taille d'un char est 1, l'adresse de ce char suivant est l'adresse du char pointé par p, plus 1.
Si p est un pointeur sur des int, p+1 a pour valeur la valeur de p plus 4, car la taille de d'un int est 4 (octets). Bref, p+1 pointe sur l'int suivant celui pointé par p, et comme la taille d'un int est 4, l'adresse de cet int suivant est l'adresse de l'int pointé par p, plus 4.  
Attention a ne pas se faire avoir par l'écriture: p+1 ne vaut pas nécessairement la valeur de p (ie l'adresse de ce qui est pointé par p) auquel on ajoute 1. p+1, c'est l'adresse de ce qui est juste après ce qui est pointé par p. Donc ca dépend de la taille de ce qui est pointé par p.
Quand le compilo voit une déclaration X* p; et que plus tard, il voit p+n, il remplace en interne l'expression p+1 par la valeur p+n*sizeof(X) pour avoir la valeur de l'adresse
A+,

Il galère déjà à comprendre comment la mémoire est organisée, pas la peine de partir là-dedans.

n°1981395
sircam
I Like Trains
Posté le 06-04-2010 à 20:30:29  profilanswer
 

Mais de là dire qu'une adresse pointe sur un octet, ça risque de le confusifier encore plus, non? [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Les valeurs vont de 4 en 4?

 

Sujets relatifs
Editer automatiquement les valeurs d'un fichier texte[PHP] foreach qui ignore des valeurs d'un tableau
Chercher des valeurs dans un fichier XMLTrier les valeurs d'un menu déroulant dans l'ordre ALPHA
Trier celons les valeurshtml + tous les fichiers qui vont avec (image, css etc) en PDF
fonction initialisé valeurs formulaires rien ne se passeAfficher caché des div qui vont par paire
Access Comment copier des valeurs d'une table vers une autrePhpBB : générer les valeurs de bbcode_bitcode et bbcode_uid
Plus de sujets relatifs à : Les valeurs vont de 4 en 4?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR