приведение указателей в C

#c #casting

#c #Кастинг

Вопрос:

У меня есть последовательный порт, возвращающий uint8 следующим образом

 uint8 bucket[255];
res = COM.com_read((char *)amp;bucket);
  

как я могу передать указатель bucket в указатель buff в функции, приведенной ниже:

 ssize_t send(int s, const void *buf, size_t len, int flags);
  

Ответ №1:

amp; не требуется в com_read , и вы должны написать это:

 //after removing 'amp;'
//bucket being an array converts to pointer automatically
res = COM.com_read((char *)bucket);  //Dont use amp;
  

Или, даже лучшее приведение было бы static_cast :

 res = COM.com_read(static_cast<char*>(bucket)); //C   Style cast!
  

И при отправке bucket в send вам не нужно приводить. Это делается компилятором неявно, потому что целевой тип является void* , и любой указатель может неявно преобразовываться в void* .

Комментарии:

1. по какой-то странной причине я привел as (const char *), и это работает, однако я привел static_cast<char *> (bucket), и это не сработало.

2. @user945511: Опубликуйте подпись com_read . Кроме того, что вы подразумеваете под «это не сработало»? Это выдало ошибку компиляции или что?

3. это подпись: int RS_232::com_read(char * xchg_space). это выдало ошибку «может t cast uint8 to char*", but this error is shown not in выполнять функцию com_read`, но в «send(int s, const void * buf, size_t len, флаги int)»

Ответ №2:

Приведение не требуется, оно выполняется неявно (любой указатель может быть приведен к const void* неявно).

Обратите внимание, что при явном приведении следует отдавать предпочтение операторам приведения C :

 res = COM.com_read(static_cast<char *>(bucket));
  

Ответ №3:

Static_cast выполнит трюк с void * и из void *, но вы уверены, что вам нужно явное приведение? Я думаю, что это должно быть сделано неявно для вас

 static_cast<void *>(bucket)
  

Комментарии:

1. у меня следующая ошибка в обоих направлениях (приведение и без приведения): Несколько маркеров в этой строке — инициализирующий аргумент 1 ‘size_t strlen(const char *)’ — недопустимое преобразование из ‘uint8 *’ в ‘const char *’