typecast для (void *) при передаче указателя на объект

Вот еще один способ сделать это. Предполагая, что у вас есть отсортированный список для начала, и вам не нужно делать просеивание на месте, мы можем просто выбрать самые длинные строки за один проход:

string_list = sorted(string_list)
sieved = []
for i in range(len(string_list) - 1):
    if string_list[i] not in string_list[i+1]:
        sieved.append(string_list[i])
4
задан chux 16 January 2019 в 20:04
поделиться

3 ответа

Нет, это не обязательно, это просто делает код более понятным в отношении того, что именно передается в функцию.

0
ответ дан markzz 16 January 2019 в 20:04
поделиться

Вам не нужно делать это с некоторыми исключениями, так как вы можете получить предупреждение, если объект, на который вы указываете функцию, - volatile или const - обычно имеет другой атрибут.

void ee(void *q)
{
    pritntf("%p", q);
}

volatile int g;
const int f;

int main()
{

    ee(&g);
    ee(&f);
}

дает это предупреждение:

<source>: In function 'main':

<source>:17:8: warning: passing argument 1 of 'ee' discards 'volatile' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&g);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'volatile int *'

 void ee(void *q)

         ~~~~~~^

<source>:18:8: warning: passing argument 1 of 'ee' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&f);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'const int *'

 void ee(void *q)

         ~~~~~~^

Compiler returned: 0
0
ответ дан P__J__ 16 January 2019 в 20:04
поделиться

Указатель на любой тип может быть свободно преобразован в или из void * без приведения.

Раздел 6.3.2.3p1 стандарта C гласит:

Указатель на void может быть преобразован в или из указателя на любой тип объекта. Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат должен сравниться с исходным указателем.

Единственный раз, когда требуется приведение, - это если вы передаете указатель на переменную функцию, такую ​​как printf, где неявное преобразование не может произойти, поскольку оно не будет знать, какой именно тип передается в есть.

Обратите внимание, что, как и с любым типом указателя, вы не можете «удалить» квалификатор, такой как const, при передаче функции без приведения. Разделы 6.3.2.3p2 гласят:

Для любого квалификатора q указатель на тип, не квалифицированный q , может быть преобразован в указатель на q -квалифицированная версия типа; значения, сохраненные в исходном и преобразованном указателях, должны сравниваться равными.

0
ответ дан dbush 16 January 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: