Où un tableau est-il défini en C et pourquoi ne dois-je pas le définir à nouveau lorsque je le passe en tant que paramètre de fonction?

J’ai écrit un programme C qui me dit la longueur, le plus bas et le plus haut caractère ANSI. La seule chose que je n’ai pas comprise, pourquoi dois-je déclarer cSsortingng dans la fonction principale, et non pasSsortingng?

#include #define LENGTH 64 int ssortingngstats(char sSsortingng[], char* cHighest, char* cLowest) { int iLength = 0; int i = 0; *cLowest = sSsortingng[0]; *cHighest = sSsortingng[0]; while(sSsortingng[iLength] != '\0') { iLength++; } for(i = 0; i <= iLength-1; i++) { if(sString[i]  *cHighest) *cHighest = sSsortingng[i]; } return iLength; } int main(void) { char cSsortingng[LENGTH] = {0}; int iLength = 0; char cHighest = 0; char cLowest = 0; while(1) { printf("input Ssortingng ('q') to exit) \n"); scanf("%62s", cSsortingng); if(cSsortingng[0] == 'q') break; iLength = ssortingngstats(cSsortingng, &cHighest, &cLowest); printf("Length = %i \n", iLength); printf("Lowest Character = %c \n", cLowest); printf("Highest Character = %c \n\n", cHighest); } return 0; } 

Fondamentalement en C, les chaînes sont des tableaux de caractères. Pour être très techniques, ils doivent se terminer par un caractère nul ‘\ 0’ à utiliser avec cstd ssortingng lib, ssortingng.h.

Alors qu’est-ce qu’un tableau? C’est un bloc continu d’éléments qui ont tous le même type. Vous pouvez considérer la notation de tableau comme une autre forme de notation par pointeur pour accéder à ce bloc de mémoire contigu **.

Dire x = array[0] est vraiment identique à x = *array et x = array[5] est vraiment identique à x = *(array+5)

Lorsque vous passez un tableau en C en tant que paramètre de fonction, vous passez en réalité un pointeur sur la tête du tableau de caractères. Votre code pourrait tout aussi bien être

 int ssortingngstats(char * sSsortingng, ... ) 

Donc, pour répondre à votre question:

pourquoi dois-je déclarer cSsortingng dans la fonction principale, et non pasSsortingng?

Votre tableau est défini dans main() – c’est là qu’il existe en mémoire. Il est alloué sur la stack et sa scope est limitée à main() . Vous n’aviez pas besoin de le déclarer dans ssortingngstats() et vous ne le pouviez pas non plus. Mais lorsque vous avez passé un pointeur sur sSsortingng, vous avez référencé le tableau. Ce faisant, vous avez en fait défini un pointeur sur le tableau de la stack – une autre variable automatique dont la scope est limitée à ssortingngstats() .

Si cSsortingng était une variable globale dans le même fichier que main() et que ssortingngstats() trouvaient dans un autre fichier, vous auriez pu déclarer cSsortingng dans ssortingngstats() via extern . Ce n’est pas la même chose que définir cSsortingng, car vous ne lui alloueriez pas de nouveaux espaces de stockage.

Voici un article connexe: notation du pointeur C par rapport à la notation du tableau: lors du passage à fonction

** Ils sont presque la même chose, mais je voudrais souligner une mise en garde. En C, il y a quelque chose appelé le type tableau. A cause de cela, sizeof() (qui tourne au moment de la compilation) peut vous donner la taille du tableau entier. Mais lorsque vous passez ce tableau, il se “décompose” en un pointeur, même si vous le transmettez avec une taille, par exemple, foo(array[x]) . Ce x est effectivement inutile. sizeof() va maintenant vous donner la taille de l’élément que vous pointez.

J’aime la réponse de Nick, mais elle dissimule certains éléments.

Fondamentalement en C, les chaînes de caractères sont des tableaux de caractères d’une longueur de huit bits, dont vous pouvez avoir besoin d’un ou plusieurs pour obtenir quelque chose que vous pouvez dessiner à l’écran et appelé un glyphe.

Ainsi, lorsque vous voyez la lettre “a”, vous voyez réellement un glyphe , qui peut être stocké dans un, deux, trois ou quatre caractères. (Dans ce cas, il est stocké dans un caractère, mais cela dépend généralement).

Pour les caractères compris entre 0 et 127, il est très sûr d’utiliser 1 “C-char” pour 1 “glyphe”, ce qui correspond approximativement à ce qu’une personne pense de “1 caractère”; Cependant, lorsque vous entrez dans 128 et au-dessus, vous devez savoir quel ensemble de règles (jeu de caractères) vous suivez ou vous pourriez trouver des erreurs de logique car votre logique ne suit pas le codage de caractères pour votre jeu de caractères .

Un exemple, si ‘a’ a pris deux caractères ‘C’, alors si vous avez écrit une routine simpliste pour obtenir la longueur, vous voudrez peut-être renvoyer 1 ou 2 en fonction des besoins.