Недавно я обнаружил, что использование strtolower()
может вызвать проблемы, когда данные усекаются после специального символа.
Решение заключалось в использовании
mb_strtolower($string, 'UTF-8');
mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.
blockquote>
Когда t
используется само по себе в выражении, происходит преобразование между массивами и указателями, это создает указатель на первый элемент массива.
Когда t
является используется как аргумент оператора &
, такое преобразование не происходит. &
затем явно принимает адрес t
(массив). &t
является указателем на массив в целом.
Первый элемент массива находится в той же позиции в памяти, что и начало всего массива, и поэтому эти два указателя имеют одинаковое значение .
Фактическим типом t
является int[10]
, поэтому &t
является адресом массива. Кроме того, int[]
неявно преобразуется в int*
, поэтому t
преобразует в адрес массива как первый элемент массива.
Нет переменной под названием t
, так как вы не можете ее изменить. Имя t
просто ссылается на адрес первого элемента (а также имеет связанный с ним размер). Таким образом, обращение адреса адреса на самом деле не имеет смысла, а C «сворачивает» его на просто адрес.
То же самое происходит для случая функций:
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
Это должно печатать одно и то же, поскольку нет переменной, удерживающей адрес foo
, адрес которого по очереди можно взять.