0
votes

L'importance du "&" lorsqu'il s'agit d'une valeur à une certaine variable?

Mon professeur nous a dit d'utiliser "&" afin de stocker des valeurs dans nos variables souhaitées, j'ai essayé d'utiliser scanf () et j'ai essayé de stocker des valeurs à certaines variables sans le "&" et j'ai remarqué que ça fonctionne juste bien? Est-ce que cela affecte mon code de toute façon malgré moi malgré cela pensant que ce n'est pas?

Voici les codes que j'ai essayés. Le code est un élément de vérifier si la deuxième entrée est une sous-chaîne. La forme originale qui est enseignée par mon professeur: p> xxx pré>

puis j'ai modifié la pièce lorsque le programme demande des entrées à ceci: p>

printf("Enter the a word: \n");
scanf("%s", word1);
printf("Enter the potetial substring: \n");
scanf("%s", word2);

c

1 commentaires

Je pense que cela est également bon pour la question de l'entrevue C.


5 Réponses :


0
votes

Si vous allez à la page Wikipedia pour Scanf, vous pouvez lire:

Peu importe le type de données Le programmateur souhaite le programme de lecture, les arguments (tels que et n ci-dessus) doivent être des pointeurs pointant vers la mémoire. Sinon, la fonction ne fonctionnera pas correctement car elle tentera de remplacer les mauvaises sections de la mémoire, plutôt que de pointer vers l'emplacement de la mémoire de la variable que vous essayez d'obtenir une entrée.

https://fr.m.wikipedia.org/wiki/scanf_format_string

Je ne sais pas quel pays vous vez, mais essayez de toujours regarder Wikipedia à la fois dans votre mère de la maternelle et en anglais. Il y a souvent plus d'informations dans les pages anglaises (mais pas toujours)


3 commentaires

Merci, je l'ai réalisé maintenant depuis que j'ai essayé d'exécuter un code avec des valeurs INT et que les programmes s'arrêtent. Il s'avère que j'ai vraiment besoin d'utiliser le «&» malgré le fait que les mots encore pour le type de données de caractère. Merci.


@HAXCKZERSSSXZ Dans votre cas, vous finissez par passer un pointeur, que vous utilisiez si vous utilisez & ou non, donc la citation ne s'applique pas. Sans parler que Wikipedia n'est pas si fiable dans certains cas.


@HolyBlackCat C'est ce que Wikipedia explique dans le paragraphe après celui que j'ai cité, mais je n'allais pas copier coller toute la page. À propos de Wikipedia, je n'ai jamais rencontré une erreur dans une page "technique". Je pense que c'est fortement fiable pour ce genre de questions.



2
votes

scanf doit connaître l'emplacement de la mémoire où placer la valeur lue et éventuellement convertie.

pour un type élémentaire, tel que int , double , char signifie pour la transmettre l'adresse de la variable.

qui est également vrai pour un tableau de caractères, cependant, Le compilateur par défaut utilise l'adresse du premier élément d'un tableau lorsque vous passez le nom de la matrice. Donc: xxx


2 commentaires

Si vous voulez bien comprendre, il existe de nombreux postes sur Stackoverflow. Faites une recherche avec "Tarray Decaying" et "Adresse de tableau". Par exemple Stackoverflow.com/questions/8106132/array-addressing et Stackoverflow.com/questions/1461432/What-is-Array-Decaying (et tout le poste associé) .


@Haxckzersssssxz Si vous avez compris, cliquez sur la tique verte à gauche de cette réponse pour marquer votre problème tel que résolu.



4
votes

C Les tableaux expriment des contextes d'évaluation (tels que votre argument passant à scanf ) en tant que pointeur à type, où le type est le type d'élément sous-jacent de la matrice. Par conséquent, mot exprime comme char * . Le résultat de l'adresse est celui du premier élément.

alors que, & word1 évalue comme adresse même estime, mais tapée à char (*) [100] (car c'est exactement ce que vous avez demandé. pour). C'est la même adresse, et donc scanf contre un % s SPÉCIFICATEUR "fonctionne" (Terme) (terme utilisé lâchement).

Votre compilateur doit avoir vigré un avertissement de vous indiquer que le type d'argument attendu était char * et que vous donnez char (*) [100] . Si ce n'est pas le cas, augmentez vos avertissements.

résumé; La syntaxe appropriée pour % s est de passer un char * . Dans ce cas, cela est obtenu par Word1 (rincer / répéter pour Word2 ). Il peut travailler à l'aide de l'adresse de l'opérateur, mais il n'y a aucune raison de l'utiliser dans ce contexte et de toutes les raisons de ne pas.


0 commentaires

1
votes

Spécifiquement lors de l'utilisation de scanf pour lire une chaîne dans char [n] (ou char * ), vous ne devez pas utiliser & .

Ainsi, la bonne voie est la suivante: xxx

Si vous enseignez, vous devez avoir besoin et dans ce cas, ils " Re faux.


% s s'attend à ce que Un argument de type Char * .

Lorsque vous passez un char tableau ( Char [n ] ) sans utiliser & , il est implicitement converti en un pointeur à son "premier élément - char * .

mais si Vous utilisez & , vous finissez par passer char (*) [n] (un pointeur sur un char tableau n < / code>) à la place.
Cela modifie le type de pointeur, mais pas sa valeur numérique ' . À cause de cela, l'ajout & n'a généralement aucun effet dans ce cas. Mais formellement, car le type de l'argument est incorrect, le comportement est indéfiend.


0 commentaires

1
votes

Le signe & code> est utilisé pour le référencement de pointeur. Imaginons que vous avez la variable suivante:

char word1[100];
printf("%08X\r\n", word1);
printf("%08X", &word1);


0 commentaires