2010-01-18 7 views
3

Je suis très novice en ce qui concerne les pointeurs, et mes connaissances en C sont assez petites. J'essaie de comprendre les pointeurs. J'ai écrit le code suivant pour imprimer une liste de variables (a à f) comme ceci:Incrémentation de variables à l'aide de pointeurs

0 
1 
2 
3 
4 
5 

j'ai écrit le code suivant pour ce faire:

#include <stdio.h> 
int main(){ 
    int a,b,c,d,e,f; 
    int *p; 
    int i; 
    a = b = c = d = f = 0; 
    p = &a; 
    for (i = 0; i < 5; i++){ 
    *p += i; 
    printf("%d\n", *p); 
    p++; 
    } 
    return 0; 
} 

L'idée était cela fonctionne à travers les variables et incrémente chacun d'un nombre toujours croissant (i). Je suppose que lorsque vous initialisez les variables en même temps, elles sont placées l'une à côté de l'autre en mémoire. Cependant, je reçois la sortie suivante:

0 
1 
2 
3 
-1218283607 

Si je change la boucle seulement passer de 0 à 3 (i < 4), il fonctionne très bien, l'imprimante 0 1 2 et 3. Mais quand je veux imprime aussi la variable f, il ne semble pas la définir. Comme je l'ai dit, je suis très novice en ce qui concerne les pointeurs, donc j'ai probablement oublié quelque chose de stupide, mais j'ai regardé mon code encore et encore, essayant de le résoudre.

Merci d'avance.

+0

Merci beaucoup :) c'était juste mon ignorance sur les variables en mémoire alors. Je vais en lire plus, merci à tous pour votre aide. – mjp

Répondre

9

Il n'y a aucune garantie que a, b, c, d, e et f seront adjacents dans la mémoire. Si vous voulez ce genre de garantie, vous devez utiliser un tableau.

#include <stdio.h> 
int main() { 
    int a[6]; 
    int *p; 
    int i; 
    a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = 0; 
    p = &a[0]; 
    for (i = 0; i < 6; i++){ 
     *p += i; 
     p++; 
    } 
    for(i = 0; i < 6; i++) { 
     printf("%d\n", a[i]); 
    } 
    return 0; 
} 

Ici int a[6] est un tableau nommé déclarant a qui peut contenir six entiers. Ces six entiers peuvent être obtenus via a[0], a[1], a[2], a[3], a[4] et a[5]. Vous avez la garantie que a[0], a[1], a[2], a[3], a[4] et a[5] sont disposées de manière contiguë en mémoire. Ainsi, la ligne

p = &a[0]; 

définit p à l'adresse du premier élément. Chaque incrément de ce pointeur nous fait avancer d'une position dans le tableau.

La seconde boucle for montre que pour les boucles premier définit correctement a[i]-i pour i en {0, 1, 2, 3, 4, 5}. Si vous exécutez ce programme, vous verrez

0 
1 
2 
3 
4 
5 

sur la console.

3

Vous avez oublié d'initialiser e. Mais oui, utilisez un tableau emballé.

1

Il n'est pas prudent de supposer que les variables de pile sont disposées en mémoire dans un ordre particulier.

Vous devez utiliser un tableau, une struct ou éventuellement une union pour garantir l'ordre de vos ints.

union { 
    int ary[6]; 
    struct { 
     int a; 
     int b; 
     int c; 
     int d; 
     int e; 
     int f; 
     } s; 
    } u = {0}; 

    p = &u.s.a; 
    for (i = 0; i < 5; i++){ 
    *p += i; 
    printf("%d\n", *p); 
    p++; 
    } 
+0

Même dans le code ci-dessus, rien n'empêche un compilateur d'insérer un remplissage entre 'a' et' b', et 'b' et' c', et, .... –

+0

Les compilateurs n'insèrent pas de bourrage arbitrairement. –

+0

Bien sûr que non, mais cela n'invalide pas le commentaire de @ Alok. – jason

Questions connexes