Странное поведение строковых указателей - PullRequest
0 голосов
/ 05 марта 2019
#include <stdio.h> 
int main()
{ 
  char*m ;
  m="srm";  
  printf("%d",*m); 
  return 0; 
}

Вывод равен 115. Может кто-нибудь объяснить, почему он выдает 115 в качестве вывода?

Ответы [ 2 ]

6 голосов
/ 05 марта 2019

*m - это то же самое, что и m[0], то есть первый элемент массива, на который указывает m, то есть символ 's'.

Используя спецификатор формата %d, вы печатаете данный аргумент как целое число. Значение ASCII 's' равно 115, поэтому вы получаете это значение.

Если вы хотите напечатать строку, используйте спецификатор формата %s (который ожидает аргумент char *) и передайте указатель m.

printf("%s\n", m);
0 голосов
/ 06 марта 2019

У вас есть несколько проблем здесь, Во-первых, вы пытаетесь добавить три байта к символу, символ - один байт. Вторая проблема заключается в том, что char * m является указателем на адрес и не является изменяемым значением lvalue. Единственный раз, когда вы должны использовать указатели, это когда вы пытаетесь указать на данные

пример:

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]); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...