2013-01-10 2 views
0

J'ai un code hérité et une fonction qui prend un tableau de caractères en paramètre.Accès au tableau, confusion de pointeur

typedef char myString[256]; 

void MyFunc(myString param) 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (param[i] .... 

Je voudrais rendre plus efficace et de passer un pointeur sur le tableau de caractères:

void MyFunc(myString *param) 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (*param[i] <========= Thsi is wrong 

Lorsque je tente de référencer les éléments du tableau, je reçois une mauvaise valeur, donc de toute évidence quelque chose mal avec mon pointeur déréférencement. Cela fait un moment que j'ai codé en C, donc je ne vois pas l'erreur évidente.

Quelqu'un peut-il le signaler?

+5

Lorsqu'il est passé à une des fonctions, des tableaux "désintégration" des pointeurs de toute façon. Vous ne le rendrez pas plus efficace en jouant à des jeux comme ça. – dmckee

+2

Il est temps d'étudier la sémantique des matrices –

+0

Cela pourrait être utile. BTW: [Le C Book - Arrays, l'opérateur & et les fonctions] (http://publications.gbdirect.co.uk/c_book/chapter5/arrays_and_address_of.html). Une de mes références C préférées. – detly

Répondre

6

Vous ne voulez probablement pas le transmettre via un pointeur; Lorsque vous utilisez le type dans l'argument, il devient quand même un pointeur, et le second niveau d'indirection est moins efficace.

Si vous utilisez le « pointeur vers un tableau » notation, alors vous avez besoin entre parenthèses pour obtenir la priorité correcte:

if ((*param)[i] ...) 
    ... 
+0

+1 et la réponse, merci. Je vous ai dit que mon C était rouillé ;-) – Mawg

1

// Ceci est OK: un tableau peut être traité comme « char * » et vice versa char myString [256];

void MyFunc(char * param) 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (param[i] ... 

Q: Je voudrais rendre plus efficace et passer un pointeur vers le tableau char

A: Il n'y a absolument aucune différence efficacité si vous passez « param [ ] "ou" * param "

for (i = 0; i < 256; i++) 
    { 
    if (*param[i] <==== <========= Thsi is wrong 

Yup - c'est faux. Encore une fois, "param[]" et "*param" doivent être traités de la même manière.

même avec ou sans « typedef », aussi :)

Enfin, voici le même programme avec le typedef:

typedef char myString[256]; 

void MyFunc(myString param) 
// This is treated as "MyFunc(char param[256])" 
// It is *identical* to "MyFunc(char * param)" 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (param[i] .... 
+1

Il y a une différence, tant en notation qu'en efficacité, lorsque le paramètre de la fonction est 'MyFunc (myString * param)' au lieu de simplement 'MyFunc (myString param)'. –

2

myString * est un pointeur sur un tableau de caractères avec 256 éléments, à savoir , param est de type

char (*)[256] 

donc vous devez déréférencer param d'abord, puis accéder à son élément.

  1. Par déréférencement param, vous avez obtenu l'adresse du premier élément du tableau param points.
  2. (*param)[i] est alors l'élément ith du tableau en question.