web-dev-qa-db-fra.com

printf () imprime tout le tableau

Supposons que j'ai le code suivant dans mon programme C:

#include <stdio.h>

void PrintSomeMessage( char *p );

int main(int argc, char *argv[]) {
    char arr[10] = "hello";
    PrintSomeMessage(&arr[0]);
    return 0;   
}

void PrintSomeMessage(char *p)
{
    printf("p: %s",p);
}

Pourquoi la sortie de ceci serait le mot entier "bonjour" au lieu d'un seul caractère "h"?

Je comprends cependant que si je mets un "%c" dans le formateur, il n'imprimera qu'une seule lettre. Mais encore, l'adresse mémoire de chaque lettre de cette adresse est différente. S'il vous plaît, quelqu'un me l'explique?

11

Mais encore, l'adresse mémoire de chaque lettre de cette adresse est différente.

L'adresse de la mémoire est différente mais comme son tableau de caractères est séquentiel. Lorsque vous passez l'adresse du premier élément et utilisez %s, printf affichera tous les caractères à partir de l'adresse donnée jusqu'à ce qu'il trouve '\0'.

26
Rohan

Dans le cas de tableaux , l'adresse de base (c'est-à-dire l'adresse du tableau) est l'adresse du 1er élément du tableau. Le nom du tableau fait également office de pointeur.

Considérons une rangée de maisons (chacune est un élément du tableau). Pour identifier la rangée, vous n'avez besoin que de la 1ère adresse de la maison. Vous savez que chaque maison est suivie de la suivante (séquentielle). Obtenir l'adresse de la 1ère maison, vous donnera également l'adresse de la ligne.

Dans le cas de littéraux de chaîne (tableaux de caractères définis lors de la déclaration), ils sont automatiquement ajoutés par \0.

printf imprime en utilisant le spécificateur de format et l'adresse fournis. Depuis, vous utilisez %s il imprime à partir de la 1ère adresse (incrémentation du pointeur en utilisant l'arithmétique) jusqu'à '\ 0'

5
Suvarna Pattayil