2012-11-07 2 views
2

Vous recherchez des explications sur un sujet spécifique relatif à l'adressage d'un tableau de chaînes. Il semble y avoir plusieurs problèmes connexes, mais je n'ai pas réussi à en trouver un qui ait discuté de ma question. Si cela vous a déjà été demandé, veuillez me diriger vers le fil de discussion correspondant.Accès à un tableau de pointeurs sur des chaînes

Dans l'extrait de code ci-dessous (vérifier l'instruction printf), j'utilise la même variable pour accéder à la valeur d'un emplacement de mémoire et à l'adresse de l'emplacement de mémoire. Je ne sais pas si c'est comme ça que je suis censé écrire ce morceau de code. Y a-t-il une meilleure façon d'indiquer clairement si j'accède à l'adresse ou à la valeur?

char *board[NUM_MAX_ROWS] = {"0101001", 
          "1101011"}; 

int main() 
{ 
    int i, num_rows=0, num_cols=0; 

    num_cols = strlen(board[0]); 
    num_rows = ARR_SIZE(board); 

    for (i=0; i<num_rows; i++) 
     printf("%s stored at %p\n", board[i], board[i]); 

} 

Ma première tentative ressemblait à ce

while(*board != '\0') 
{ 
    printf("%s stored ar %p\n", *board, board); 
    board++; 
} 

Il est évident que cela ne fonctionne pas :) mais je ne suis toujours pas tout à fait sûr de la façon dont elle est interprétée par le compilateur.

Merci.

+0

Votre premier code est correct. Vous passez un pointeur ('char *') deux fois - l'interprétation de l'argument dépend alors des spécificateurs de format. '% s' imprimera des caractères commençant à l'adresse et s'arrêtant au caractère NUL. '% p' imprimera simplement l'adresse. – jrok

+0

Pourriez-vous expliquer pourquoi le deuxième ne fonctionne pas OBLIGATOIREMENT? – texasbruce

+0

La deuxième pièce n'a pas pu être compilée avec erreur: lvalue requise comme opérande d'incrément (en référence à la carte ++). Je pensais que cela augmenterait un pointeur. – dinesh

Répondre

1

Vous pouvez obtenir la première tentative de travail en déréférençant le pointeur une fois pour obtenir l'adresse de la chaîne elle-même.

printf("%s stored ar %p\n", *board, *board);

BTW lors de l'écriture en utilisant la syntaxe de tableau, il est en fait identique à

printf("%s stored ar %p\n", *(board+i), *(board+i));

Edit: il me semble avoir lu manquer la question .. fixation.

0

Vous pouvez le faire de cette façon:

#include <stdio.h> 

char *board[] = {"0101001", 
       "1101011", 
       0}; /* note this final 0 as a terminator for stopping the loop */ 

int main() 
{ 
    int i, num_rows=0, num_cols=0; 
    char **c; 

    c = &board[0]; 
    while(*c) 
    { 
     printf("%s stored ar %p\n", *c, *c); 
     c++; 
    } 

    return 0; 
} 

Cependant, vous devez avoir un bouchon en boucle si vous le faites. En outre, il y a des gens qui préconisent l'utilisation NULL au lieu de 0 pour plus de clarté.

Questions connexes