2009-12-04 5 views
3

J'ai une fonction:Passant chaîne comme un argument en C

int getparam(char *gotstring) 

et je passe un argument de chaîne à elle, comme char *sendstring = "benjamin"

au lieu de la déclaration ci-dessus je peux utiliser,

int getparam(char gotstring[]) 

Question: Lequel est le meilleur? Et si je dois utiliser int getparam(char gotstring[]), quels sont les autres changements que je dois apporter à la fonction existante?

Répondre

5

int getparam(char gotstring[]) et int getparam(char* gotstring) sont identiques. Personnellement, je recommanderais cette dernière syntaxe, car elle décrit mieux ce qui se passe réellement. La fonction getparam a seulement un pointeur à la chaîne; il n'a aucune connaissance de la taille réelle du tableau. Cependant, c'est juste mon opinion; l'un ou l'autre fonctionnera.

1

Dans ce cas, ils signifient la même chose, et vous n'avez pas besoin de changer le reste de votre fonction. Mais sachez qu'en général, les tableaux et les pointeurs sont des choses différentes.

1

Ni l'un ni l'autre n'est meilleur, vraiment. C'est ce que vous êtes le plus à l'aise. De manière idiomatique, il est plus courant d'utiliser char * arg au lieu de char arg [] (pensez à strcmp, strcpy, etc.).

+3

En termes de qui est réellement meilleur, j'ai toujours senti que la syntaxe 'char mystring []' en tant que paramètre de fonction est vraiment trompeuse. Cela a historiquement causé une confusion sans fin parmi les programmeurs C inexpérimentés qui croyaient à tort que les informations de taille de tableau étaient conservées dans le paramètre function, et que 'sizeof (mystring)' retournerait donc la taille du tableau plutôt que la taille du pointeur . Personnellement, je pense que cette syntaxe ne devrait même pas être autorisée. –

1

La meilleure façon d'accepter un argument de chaîne est

int getparam(const char *gotstring); 

Vous pouvez appeler cela en utilisant une chaîne littérale:

int main(void) 
{ 
    int x = getparam("is this a parameter string?"); 
    return 0; 
} 

ou un tableau de caractères:

int main(void) 
{ 
    char arg[] = "this might be a parameter string"; 
    int x = getparam(arg); 
    return 0; 
} 

Le l'utilisation de const sur le pointeur d'argument indique à l'appelant que l'argument est en lecture seule de la fonction, ce qui est une très bonne information.

1

Comme les tableaux sont envoyés par renvoi dans les deux C

int getparam(char *gotstring) 

et

int getparam(char gotstring[]) 

signifie la même chose. Mais le premier est utilisé plus. Donc, en utilisant ce fait un bon citoyen C.

+0

J'ai tendance à ne pas être d'accord (en particulier avec l'explication de la mentalité de troupeau). Ces constructions sont identiques pour le compilateur, pour l'humain elles peuvent (et devrais-je dire) différer sémantiquement: [] indique passer un tableau, * passer un pointeur vers un seul élément. – MaR

-1

Ceci est appelé passage par référence et comment le nom l'indique, cela signifie passer juste une référence de la variable (dans ce cas un char*).

Soit solutions fonctionnent correctement, ce qui va réellement se passer est que, quand void functionName(char* string) est appelée, l'adresse de la première char en mémoire sera enregistré sur pile et passé en paramètre à la fonction.

Par conséquent, toute modification apportée à la variable à l'intérieur de la fonction modifierait également la variable d'origine.Dans ce cas, puisque vous devez passer un tableau, vous avez juste cette option.

Pour les types standards comme int, float vous pouvez les distinguer:

void passByValue(int i); 
void passByReference(int &i); 

La différence est que, dans l'ancienne valeur de cas est copié dans la pile lorsque vous appelez la fonction, alors que dans celui-ci juste une référence (pointeur) à la valeur est passée.

+0

S'il vous plaît, je voudrais connaître les raisons pour lesquelles il est possible de faire des pieds coupés, juste pour comprendre les erreurs et éviter de les répéter. Un downvote sans raison est inutile, surtout pour moi. Merci .. – Jack

+0

Je ne vous ai pas downvote donc je ne peux pas l'annuler, mais probablement le downvoter est ennuyé que vous confondiez l'idée de passer par référence en passant un pointeur par valeur –

Questions connexes