-4
votes

Comportement étrange de cordes de cordes

#include <stdio.h> 
int main()
{ 
  char*m ;
  m="srm";  
  printf("%d",*m); 
  return 0; 
}
The output is 115.  Can someone explain why it gives 115 as output?

2 commentaires

Parce que c'est la valeur ASCII de la lettre 's'


Quel résultat vous attendiez-vous?


3 Réponses :


6
votes

* m est identique que m [0] , c'est-à-dire le premier élément du tableau pointé par M qui est le caractère 's' .

En utilisant le spécificateur de format % d , vous imprimez l'argument donné en tant qu'intéger. La valeur ASCII de 's' est de 115, c'est pourquoi vous obtenez cette valeur.

Si vous souhaitez imprimer la chaîne, utilisez le % s Spécificateur de format (qui attend un char * argument) et transmettez le pointeur m . xxx


2 commentaires

Et si je veux imprimer la chaîne. Est-ce que% s fera faire?


@Vasuseh % s avec m comme argument, pas * m



0
votes

Vous avez quelques problèmes ici, Le premier est que vous essayez d'ajouter trois octets à un caractère, un caractère est un octet. Le deuxième problème est que CHAR * M est un pointeur à une adresse et n'est pas une lvalue modifiable. La seule fois que vous devez utiliser les pointeurs est lorsque vous essayez de pointer sur Data

Exemple: P>

char byte = "A"; //WRONG
char byte = 0x61; //OK
char byte = 'A'; //OK
//notice that when setting char byte = "A" you will recieve an error, 
//the double quotations is for character arrays where as single quotes,
// are used to identify a char
enter code here
char str[] = "ABCDEF";
char *m = str;

printf("%02x", *m); //you are pointing to str[0]
printf("%02x", *m[1]); //you are pointing to str[1]
printf("%02x", *m[1]); //you are pointing to str[1]
printf("%02x", *(m + 1)); //you are still pointing to str[1]
//m is a pointer to the address in memory calling it like
// *m[1] or *(m + 1) is saying address + one byte
//these examples are the same as calling (more or less)
printf("%02x", str[0]); or 
printf("%02x", str[1]); 


8 commentaires

J'ai oublié de mentionner lors de l'utilisation de Printf, si vous souhaitez imprimer un tableau de caractères, utilisez% s comme mentionné par d'autres utilisateurs, si vous utilisez% PrintF% S, le tableau de caractères doit être résilié null


En pointant vers un pointeur, vous êtes réellement déshergéfrenant, alors * m [1] retournerait la valeur de STR [1], m [1] va retourner, je crois que la partie de l'adresse ou des ordures que je ne suis pas sûre que


Non, m contient un pointeur sur le premier élément de str . La syntaxe m [1] est exactement équivalente à * (m + 1) selon la section 6.5.2.1P2 du C standard .


S'il est exactement équivalent à * (M + 1), pourquoi considérez-vous cela invalide au lieu de sténographie, 6.5.2.1P2 indique que ce n'est rien de plus qu'une désignation indiquée, ce qui signifie qu'il est littéralement sténographique?


Dans l'exemple, je mets à la fois et même indiqué qu'ils sont les mêmes ...


* (m + 1) va bien. * m [1] est pas . Il se traduit par ** (m + 1) . m est un char * , donc m + 1 est également un char * , faisant * ( m + 1) == m [1] a char , qui fait ** (m + 1) == < Code> * m [1] invalide parce que vous ne pouvez pas la désarférence, un char comme s'il s'agissait d'un pointeur.


Le code que vous avez posté échoue pour compiler exactement cette raison.


par golly tu as raison. Je vais devoir lire ce document que vous avez posté et essayer d'obtenir un meilleur sous debout, je suppose. Je pensais que je l'avais à peu près emballé: /



0
votes

Les pointeurs et les tableaux agissent de la même manière que les noms .Array sont également des pointeurs pointant vers le premier élément de la matrice. Vous avez stocké "SRM" comme une matrice de caractères avec M pointant vers le premier élément. "% D" vous donnera la valeur ASCII de l'article pointant par le pointeur. La valeur ASCII de "S" est 115. Si vous incrémentez votre pointeur (M ++), imprimez la valeur ASCII, la sortie sera une valeur ASCII de «R» - 114.

#include <stdio.h> 
int main()
{ 
  char *m ;
  m="srm"; 
  m++;       //pointing to the 2nd element of the array
  printf("%d",*m);   //output = 114
  return 0; 
}


1 commentaires

Les tableaux ne sont pas des pointeurs. Les pointeurs ne sont pas des tableaux. Reste de réponse ok.