2014-09-20 4 views
1

Je suis confus quant à la façon d'utiliser des pointeurs pour obtenir ce code au travail:C type pointeur argv

#include<stdio.h> 

int main(int argc, char *argv[]){ 

    char* test = argv[1][0]; 
    printf("hello %s\n", test); 
} 

Voici l'erreur:

incompatible integer to pointer conversion initializing 
    'char *' with an expression of type 'char'; take the address with & 
    [-Wint-conversion] 
+2

Vous devez utiliser comme 'char * test = argv [1];' .'argv [1] [0] 'est de type' char' et vous l'avez assigné à 'char *' ce qui cause votre problème. –

+0

Pour imprimer un 'char', vous devez utiliser'% c'. '% s' doit afficher un tableau' char' '' '' terminé par '0', appelé" chaîne ". – alk

Répondre

8

Le type de argv[1][0] est char. Le type de argv[1] est .

Vous devez utiliser:

char* test = argv[1]; 

Si vous invoquez votre programme avec:

program "First Arguent" "Second Argument" 

puis, dans main, argc est égal à 3.

argv[0] = "program" 
argv[1] = "First Arguent" 
argv[2] = "Second Arguent" 
argv[3] = NULL 

Compte tenu de ce cas,

argv[1][0] est évaluée à le premier caractère de argv[1], qui est égale à 'F'.

Si c'est ce que vous voulez obtenir, vous pouvez utiliser:

char test = argv[1][0]; 

Si vous souhaitez obtenir tout le premier argument, alors vous devez utiliser:

char* test = argv[1]; 
+0

Il est généralement intéressant de considérer le sens des expressions, pas seulement leur type. Dans ce cas, bien sûr, le type vous aidera à vous y rendre. Mais puisque nous enseignons, les deux devraient être explorés. –

+0

Ceci est excellent, je voulais obtenir le premier caractère de arv [1] donc j'utilisais simplement char * au lieu de caractère en cas d'accident. Merci! –

+1

@ LightnessRacesinOrbit, merci de contribuer à améliorer la réponse. –

6

Le premier argument est argv[1], et argv[1][0] est le premier caractère de cet argument. Modifiez le code à

char* test = argv[1]; 
1

char * argv [] est un tableau de pointeurs, et chaque pointeur pointe sur un tableau de caractères (terminé par un caractère nul). Supposons que vous transmettiez "Hello World" comme argument de ligne de commande à votre programme. L'adresse de base de la chaîne (tableau de caractères à terminaison nulle) est stockée dans argv [1]. Puisque argv [1] pointe sur une chaîne, argv [1] [0] donne le caractère 0th
dans la chaîne.

Considérons maintenant votre mission:

char* test = argv[1][0]; 

ici en utilisant argv [1] [0], vous indexez réellement à l'intérieur de la chaîne pointée par le
argv [1], et l'affectation du charcater stocké au 0e indice de la chaîne à l'essai
pointeur. Puisque "test" est un pointeur, il est lié à stocker l'adresse et non la valeur.
L'attribution ci-dessus attribue une valeur de caractère à tester, et que les personnages sont
représentés en interne comme des entiers dans C, donc vous obtenez un avertissement qui dit:

incompatible integer to pointer conversion initializing 

ici la valeur entière se réfère à argv [ 1] [0] et le pointeur est test.

L'affectation ci-dessus peut être utilisé comme:

char *test = &argv[1][0]; // assignment 1 

qui équivaut à:

char *test = argv[1]; // assignment 2 

tant que l'indice dans l'attribution 1 est 0.