«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Пустые указатели в C и C++: чем отличаются неявные преобразования?

Пустые указатели в C и C++: чем отличаются неявные преобразования?

Опубликовано 20 ноября 2024 г.
Просматривать:458

  Void Pointers in C and C  : Why are Implicit Conversions Different?

Понимание указателей Void: различия между C и C

Указатели Void являются ключевым аспектом как C, так и C , но есть заметные различия в их обращении. В этой статье рассматриваются эти различия и объясняется, почему может возникнуть, казалось бы, противоречивое поведение.

Неявные преобразования в C

В C — преобразования между указателями на определенный тип (например, int) и указатель void (void) всегда неявны. Это означает, что справедливо следующее утверждение:

int* p = malloc(sizeof(int));

Функция malloc возвращает void*, который затем присваивается указатель int*. Однако в C такие неявные преобразования не разрешены.

Явное приведение типов в C

В C преобразование из указателя в указатель void по-прежнему выполняется неявно, но преобразование указателя void в определенный тип требует явного приведения. Это объясняет, почему следующий код компилируется как на C, так и на C:

void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}

Функция malloc возвращает void*, который передается функции foo. Несмотря на то, что указатель int* присвоен параметру void*, C допускает это неявное преобразование. Однако последующий вызов p требует явного приведения к типу int*.

Перспектива стандарта

Согласно спецификации K&R2, любой указатель на объект может быть безопасно преобразованы в void* без потери информации. Более того, преобразование обратно в исходный тип указателя восстанавливает исходное значение. В C стандарт определяет, что неявные преобразования любого типа указателя в void* разрешены, но для преобразований из void* в любой другой тип необходимо явное приведение.

Заключение

Ключевое различие между обработкой указателя void* в C и C заключается в необходимости явного приведения типов при преобразовании из void* в определенный тип в C . Этот более строгий подход помогает предотвратить неопределенное поведение и обеспечивает безопасность типов в коде C.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3