C ++ символьные указатели - PullRequest
       1

C ++ символьные указатели

0 голосов
/ 19 августа 2011

у меня есть

*(char *) &data;

но нужно отправить как

(char *) &data;

Есть ли разница между ними?

Добавлена ​​


Извините за путаницу. У меня есть два приложения, первое приложение на C, которое дает мне * (char *) и данные. На принимающей стороне (отправка по UDP) приложение C ++ ожидает данные как (char *) & data. Я хотел бы уточнить, если оба понятия означают одно и то же или разное


Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Да.Есть разница.Тип первого выражения: char& 1 .Тип второго выражения: char*.

1.Спасибо Питу за объяснение, почему его char&, а не char.Прочитайте комментарии.

2 голосов
/ 19 августа 2011
&data

Это предоставит адрес переменной данных. Указатель указывает на участок памяти, выделенный для данных.

(char *) &data

Затем мы вводим указатель на символьный указатель - теперь данные фактически интерпретируются как поток символов (по 1 байту за раз). Таким образом, все еще в памяти это то же самое адресное местоположение, только что мы хотим интерпретировать этот фрагмент памяти другим способом, используя приведение типов. Наконец,

*(char *) &data

возвращает значение в ячейке памяти, на которую указывает указатель, который мы получили сверху - это первый байт памяти.

0 голосов
/ 19 августа 2011

Это похоже на очень запутанный код.

Как уже упоминалось, первое выражение оценивается как символ & (редактируемая ссылка на символ), а второе - как символ *.

Первый - это указатель с разыменованной ссылкой на ссылку на символ. Второй - указатель на ссылку на символ. И то и другое кажется глупым способом передачи мне данных о символах. Если вам нужно отправить обновляемую ссылку, отправьте &data, который будет указателем на ваш char data. Если под send вы подразумеваете переход в метод, вы также можете определить метод как что-то вроде

void foo(char& inData) { ... }

в этом случае вы можете позвонить

foo(data);

и параметр inData внутри foo будет обновлен, поскольку он является справочным. Другой вариант -

void foo(char* data) { ... }

в этом случае вы бы позвонили

foo(&data);

Это более чистый подход в стиле C, но я все еще использую его довольно часто в C ++, потому что я считаю более очевидным, что вы имеете дело со ссылкой на объект, когда он явно объявлен как указатель.

Я не уверен, почему вы хотите иметь дело с такими вещами, как *(char *) &data, и я рискну сказать, что было бы плохой практикой использовать это в вашем коде, так как это делает ваш код менее читаемым.

Подробнее о ссылках и сравнении с указателями смотрите здесь http://www.cprogramming.com/tutorial/references.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...