Dois-je fonte des tableaux de pointeurs lors de leur passage à variadic fonctions comme printf?
Puis-je passer un tableau à printf directement:
char text[1024] = "text";
printf("%s", text);
Ou devrais-je convertir explicitement à un pointeur de char:
char text[1024] = "text";
printf("%s", (char*) text);
Je demande parce que j'ai pensé que peut-être il copie les éléments du tableau directement dans le va_list au lieu de mettre simplement un pointeur vers le premier élément.
il n'y a pas de différence
Il suffit de ne pas oublier le terminateur null.
est {'t','e','x','t',0}
Oui stefan, mais si vous êtes de manipuler des tableaux (et de poser cette question) c'est quelque chose à retenir.
Je ne dis pas que c'est directement pertinente. Je viens de supposer que c'est probablement quelqu'un qui est de stocker du texte dans les tableaux seront en faisant des choses comme la copie de texte à partir d'un tableau à l'autre. Aussi, si cette personne est un parent débutant, car cette question me suggère, alors ils voudront peut-être conscient des choses comme le fait que
Il suffit de ne pas oublier le terminateur null.
est {'t','e','x','t',0}
Oui stefan, mais si vous êtes de manipuler des tableaux (et de poser cette question) c'est quelque chose à retenir.
Je ne dis pas que c'est directement pertinente. Je viens de supposer que c'est probablement quelqu'un qui est de stocker du texte dans les tableaux seront en faisant des choses comme la copie de texte à partir d'un tableau à l'autre. Aussi, si cette personne est un parent débutant, car cette question me suggère, alors ils voudront peut-être conscient des choses comme le fait que
strlen
sera de retour à un nombre inférieur au nombre d'octets que vous voulez généralement à copier. Juste essayer d'être utile.OriginalL'auteur sashoalm | 2012-04-09
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez passer un tableau directement. Exactement, le nom du tableau représente l'adresse du tableau qui ne fait pas de différence avec
char *
.OriginalL'auteur Summer_More_More_Tea
(char*)text
ettext
pas faire toute la différence dans cet exemple! Adresse de Base d'un tableau se désintègre en un pointeur lorsqu'il est passé comme un argument de fonction.En fait, même si
text
n'était pas unchar
tableau, là encore, il ne devrait pas faire une différence pourprintf
, car il est une variable en fonction d'argumentet tout ce qu'il se soucie est sur le premier argument. La logique qui pourrait aller mal, mais
printf
s'en fout!OriginalL'auteur Pavan Manjunath
Réponse courte, oui,
tableaux en C _are_a pointeur vers son premier élément.(Edit: Plus de réponse, eh bien, en fait, les tableaux en C sont des identifiants ou des étiquettes qui sont juste des noms, mais lorsqu'il est utilisé comme partie d'une expression qui n'a pas de préface avec & sizeof ils se converti au ou autrement évalués comme des pointeurs).Même plus répondre: Vous voyez, les fonctions ne peuvent pas vraiment recevoir un tableau comme argument, mais le compilateur a leur envoyer quelque chose, alors il envoie un pointeur. Ainsi, la première phrase devrait probablement commencer avec "autant Que des fonctions comme
printf()
sont concernés..."Certaines fonctions prétendre à prendre un tableau, mais c'est juste une illusion. Ces deux fonctions sont les mêmes.
Le C entrée de la FAQ ci-dessous examine plus en détail les différences subtiles entre les tableaux et les pointeurs:
a[0] génère de complètement différent que le code b[0], mais ils sont à peu près équivalentes en ce que le subscripting opérateur [] nous donne le résultat attendu.
Fait intéressant, le spécificateur de format "%s\n" aussi est passé à
printf()
comme un pointeur.http://www.lysator.liu.se/c/c-faq/c-2.html
N'est-ce pas un tableau/arrayname toujours un pointeur vers le premier élément en C?
En fait, la première phrase est pas corriger. Les tableaux sont pas pointeurs. Elles désintègrent les pointeurs dans de nombreux cas (pas tous) mais juste essayer de incrémenter un tableau et un pointeur - les dernières œuvres, le premier n'a pas:
char x[10]; char *y = x; x++; y++;
ne fonctionnera pas pour lesx++
.Plus proche de la "machine", les tableaux ne sont rien, mais les données qui se trouvent quelque part. Le "évident" chemin d'accès tableau d'éléments de mémoire (ces données) est de passer par un pointeur. Mais loin de la machine de PoV, étant donné
T a[N]
,a
doit être immuable référence (pointeur) vers le premier élément; peut-être il peut être dit simplement qu'il ne peut pas être un lvalue exactement comme&(a[0])
, ce qui justifie l'échec dea++
. Donc, je dirais,a
est juste sucre syntaxique pour&(a[0])
et d'être si il est correct de direa
est juste un pointeur vers le premier élément du tableau.Édité à l'utilisation de la langue qui est moins ambigu, tout en essayant de ne pas plagier. Trouvé la référence, je cherchais dans la c faq.
OriginalL'auteur hellork
Sauf quand c'est l'opérande de l'
sizeof
ou unaire&
opérateur, ou est un littéral de chaîne utilisée pour initialiser un tableau avec un autre dans une déclaration, un expression de type "N-élément de tableau deT
" sera remplacé par une expression de type "pointeur versT
" dont la valeur est l'adresse du premier élément du tableau.Lorsque vous écrivez
l'expression
text
est remplacée par une nouvelle expression de typechar *
dont la valeur est&text[0]
, et cette valeur du pointeur est ce qui est passé àprintf
. Cela signifie que vous n'avez pas de jeter l'argument. Cela signifie également que vous ne pouvez pas passer un tableau d'expression en tant que paramètre de la fonction et ont la fonction appelée recevoir comme un tableau type. La conversion se fait avant que la fonction est appelée.OriginalL'auteur John Bode
noms de pointeurs et les tableaux sont échangeables. (En plus de l'allocation de mémoire)
Lorsque vous avez
Vous pouvez écrire
Mais vous ne pouvez pas faire
Vous pouvez envisager de
array b
commechar * const b
comme un unmodifyable pointeurOriginalL'auteur stefan bachert