2013-03-04 7 views
1

J'ai écrit un petit programme de test pour voir comment je peux passer un pointeur vers un tableau char à une fonction. Ceci est mon code:en passant un pointeur sur un tableau char dans c

#include <stdio.h> 
#include <string.h> 

int scopy(char *org){ 
    printf("the value of org is %s" , org); 
    printf("\n"); 
} 

int main(void) 
{ 
    char original[11]; 
    strcpy(original , "helloworld"); 

    scopy(original); 

    printf("the value of original now is %s" , original); 

    return 0; 
} 

Ma connaissance de pointeurs me dit que org est un pointeur qui est transmis l'adresse de la mémoire de l'original [0], quand j'exécute ce programme, je remarque quelques petites choses qui m'a confus et m'a fait douter des faits que j'ai appris sur les pointeurs.

Lorsque j'imprime org je récupère le mot complet. mais selon la logique si les pointeurs ne sont pas censés imprimer l'adresse mémoire;

lorsque je tente imprimer sur [1], sur [2], CodePad me dit que le processus est terminé anormalement

Mon doute de base à cette question est que fait org exactement, je comprends est char pointeur pointant vers une adresse mémoire (qui ??). Toute aide serait appréciée . Je suis très nouveau à la programmation c.

Aussi lorsque je tente une boucle while comme

while(out[i] !='\0') 
printf("%s",out[i]); 

ne se termine pas au '\ 0'. La documentation strcpy indique que le '\ 0' est copié dans le tableau char.

Répondre

3

org est un pointeur vers un char, qui est ce que vous passez dans scopy (un pointeur vers le premier élément d'un tableau). Lorsque vous utilisez le spécificateur %s dans printf vous traitez un pointeur vers un caractère en tant que chaîne; Si vous souhaitez imprimer sa valeur en tant que pointeur, vous devez utiliser %p à la place. Par exemple: printf("The memory address in org is %p\n", org);

De ce que vous dites, j'ai l'impression que vous pensez que %s va convertir un nombre à une chaîne. Il ne le fera pas, il attend un pointeur vers le premier caractère d'une chaîne. Rappelez-vous que le nom d'un tableau est équivalent à &array[0], c'est-à-dire lorsque vous passez le nom d'un tableau dans une fonction, vous passez un pointeur sur le premier élément. Donc, ici, quand vous appelez scopy(original) c'est la même chose que d'écrire scopy(&original[0]), et depuis original[0] est un char et & est un pointeur, c'est pourquoi votre fonction prend char *.

0

Oui, vous avez raison, lorsque vous appelez scopy(original);, scopy passe un pointeur sur l'élément 1. dans le tableau original.

scopy(original); est exactement le même que scopy(&original[0]);

Cependant, vous utilisez% s avec printf. % s s'attend à ce que l'argument correspondant soit un pointeur char, se reliant à une séquence de caractères, et la fin de cette séquence est un octet 0. C'est ce que C appelle une chaîne.

Cela signifie que vous ne pouvez pas faire, par ex. printf("%s",org[i]);, puisque org [i] est un char, ce n'est pas un pointeur char dans un tableau qui se termine par un 0 octet.

Vous pouvez imprimer un seul caractère en faisant prinf["%c", org[0]) `while (out [i]!= '\ 0')

Ou pour votre boucle while:

while(out[i] !='\0') 
    printf("%c",out[i]); 

Et vous pouvez également essayer:

while(out[i] !='\0') 
    printf("%s",&out[i]); 
Questions connexes