Les valeurs vont de 4 en 4?

Les valeurs vont de 4 en 4? - C - Programmation

Marsh Posté le 04-04-2010 à 13:29:30    

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

Reply

Marsh Posté le 04-04-2010 à 13:29:30   

Reply

Marsh Posté le 04-04-2010 à 13:33:33    

sizeof int

Reply

Marsh Posté le 04-04-2010 à 13:37:18    

In octet or in word ?

Reply

Marsh Posté le 04-04-2010 à 14:03:08    

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
Reply

Marsh Posté le 04-04-2010 à 15:01:51    

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
Reply

Marsh Posté le 04-04-2010 à 15:34:58    

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

Reply

Marsh Posté le 04-04-2010 à 16:58:47    

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
Reply

Marsh Posté le 06-04-2010 à 09:59:45    

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.

Reply

Marsh Posté le 06-04-2010 à 10:21:42    

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é!  --
Reply

Marsh Posté le 06-04-2010 à 10:41:40    

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
Reply

Marsh Posté le 06-04-2010 à 10:41:40   

Reply

Marsh Posté le 06-04-2010 à 11:03:58    

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.

Reply

Marsh Posté le 06-04-2010 à 20:30:29    

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}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed