C ++ Передача указателя на функцию, ожидающую void *, работает по-разному, почему? [Дубликат]

Недавно я обнаружил, что использование strtolower() может вызвать проблемы, когда данные усекаются после специального символа.

Решение заключалось в использовании

mb_strtolower($string, 'UTF-8');

mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.

24
задан Kevin Reid 4 June 2013 в 15:32
поделиться

3 ответа

Когда t используется само по себе в выражении, происходит преобразование между массивами и указателями, это создает указатель на первый элемент массива.

Когда t является используется как аргумент оператора &, такое преобразование не происходит. & затем явно принимает адрес t (массив). &t является указателем на массив в целом.

Первый элемент массива находится в той же позиции в памяти, что и начало всего массива, и поэтому эти два указателя имеют одинаковое значение .

25
ответ дан Mankarse 4 September 2018 в 08:10
поделиться

Фактическим типом t является int[10], поэтому &t является адресом массива. Кроме того, int[] неявно преобразуется в int*, поэтому t преобразует в адрес массива как первый элемент массива.

3
ответ дан Abyx 4 September 2018 в 08:10
поделиться

Нет переменной под названием t, так как вы не можете ее изменить. Имя t просто ссылается на адрес первого элемента (а также имеет связанный с ним размер). Таким образом, обращение адреса адреса на самом деле не имеет смысла, а C «сворачивает» его на просто адрес.

То же самое происходит для случая функций:

int foo(void)
{
  return 12;
}

printf("%p and %p\n", (void *) foo, (void *) &foo);

Это должно печатать одно и то же, поскольку нет переменной, удерживающей адрес foo, адрес которого по очереди можно взять.

-2
ответ дан unwind 4 September 2018 в 08:10
поделиться
Другие вопросы по тегам:

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