2010-11-27 5 views
6

Что такое char*, точно? Это указатель? Я думал, что указатели имели звездочку перед идентификатором, а не тип (что не обязательно одно и то же) ...?Что такое `char *`?

+9

C не интересует пробелы, поэтому `char * foo;` - это то же самое, что и `char * foo;` – 2010-11-27 20:17:14

+6

@PaulTomblin: C не заботится о пространствах, просто не в этом конкретном случае. `char apple;` и `charapple``, совсем разные. – 2012-01-17 17:47:48

ответ

17

Это указатель на char.

При объявлении указателя звездочка идет за типом и перед идентификатором, причем пробелы несущественны. Все они заявляют, char указатели:

char *pointer1; 
char* pointer2; 
char * pointer3; 
char*pointer4; // This is illegible, but legal! 

Чтобы сделать вещи еще более запутанной, при объявлении нескольких переменных одновременно, звездочка относится только к одному идентификатору (на его справа). Например .:

char* foo, bar; // foo is a pointer to a char, but bar is just a char 

Это в первую очередь по этой причине, что звездочка обычно помещается непосредственно рядом с идентификатором и не типа, поскольку это позволяет избежать этой запутанной декларации.

+0

Почему же при объявлении нескольких указателей на одной строке вам нужно использовать звездочку для каждой из них? Например, `char * Pointer1, * Pointer2;`. – Maxpm 2010-11-27 20:20:15

15

Это указатель на персонажа. Вы можете написать либо

char* bla; 

или

char *bla; 

Это то же самое.

Теперь, в C, для строк использовался указатель на символ: первый символ строки будет содержать указатель, следующий символ в следующем адресе и т. Д. И т. Д. До Null -Terminal-Symbol \0.

НО: Нет необходимости делать это на C++. Вместо этого используйте std :: string (или аналогичные классы). Свойство char * было названо самым частым источником ошибок безопасности!

1

http://cplusplus.com/doc/tutorial/pointers/

* характер проявляется в двух различных местах при работе с указателями. Во-первых, тип «указатель на T» обозначается T* (добавление * к типу). Во-вторых, при разыменовании указателя, который делается путем добавления * к имени переменной указателя, которую вы хотите разыменовать.

1

Пробелы обычно не имеет значения, так

char* suchandsuch; 

char *suchandsuch; 

char 
* 
suchandsuch; 

все же.

Смежные вопросы