В следующих правилах для случая, когда массив затухает к указателю:
lvalue [видит вопрос 2.5] типа array-of-T, который появляется в затуханиях выражения (за тремя исключениями) в указатель на его первый элемент; тип результирующего указателя является pointer-to-T.
(Исключения - когда массив является операндом sizeof или и оператор или является инициализатором литеральной строки для символьного массива.)
Как понять случай, когда массив является "инициализатором литеральной строки для символьного массива"? Некоторый пример.
Спасибо!
Три исключения, когда массив не распадается на указатель, следующие:
Исключение 1. - Когда массив является операндом размера
.
int main()
{
int a[10];
printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */
int* p = a;
printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}
Исключение 2. - Когда массив является операндом оператора &
.
int main()
{
int a[10];
printf("%p", (void*)(&a)); /* prints the array's address */
int* p = a;
printf("%p", (void*)(&p)); /*prints the pointer's address */
}
Исключение 3. - Когда массив инициализируется строкой литерала.
int main()
{
char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */
char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}
Это инициализатор строки букв для символьного массива:
char arr[] = "literal string initializer";
Может быть также:
char* str = "literal string initializer";
Определение из K&R2:
Строковый литерал, также называемый строкой постоянная, это последовательность символов окружённый двойными кавычками, как в "...". Строка имеет тип ``массив''. статический класс хранения символов (см. пункт А.3 ниже) и инициализирована с заданными символами. Будет ли различные строковые литералы определяется реализацией, и поведение программы, которая пытается изменить строковый литерал не определено.
Похоже, вы вытащили эту цитату из FAQ COMP.LANG.C (может быть, старая версия или, возможно, напечатанная версия; это не совсем совпадает с текущим состоянием онлайн):
http: //c-faq.com/aryptr/aryptrequiv.html
the Соответствующее разделение ссылок на другие разделы FAQ для разработки этих исключений. В вашем случае вы должны посмотреть:
Этот регекс идеально подходит для меня.
^([ \u00c0-\u01ffa-zA-Z'\-])+$
Это хорошо работает в php-средах с использованием preg_match (), но не везде.
Он соответствует Jérémie O'Co-nor
, поэтому я думаю, что он соответствует всем UTF-8 именам.
Если вы не можете поместить дракона в A, вам потребуется создать другую таблицу и другую таблицу ссылок. Проблема заключается в создании уникального набора данных, которые необходимо сохранить (другая таблица), который не может быть таким же набором, как A. Так как это не тот же набор, вы больше не можете использовать таблицу связей (AtoB), который имеет внешние ключи, гарантирующие, что ссылка является ссылкой из набора A. Таким образом, можно создать следующие таблицы:
Позже, когда вы хотите получить всех существ в зоопарке, вы можете сделать UNION
SELECT A.Name FROM A where A.ID IN
(SELECT AB.A_ID FROM AtoB AB WHERE B_ID =
(SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))
UNION
SELECT i.name FROM imaginary_creatures i i.id IN
(SELECT ic.imaginary_creatures_id FROM imaginary_creatures_to_c ic
WHERE ic.b_id = (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))
Возможно, есть лучший способ написать это, но это
-121--4180476-Предположим, что объявления
char foo[] = "This is a test";
char *bar = "This is a test";
В обоих случаях типом строкового литерала « Это тест
» является «15-элементный массив символов». В большинстве случаев выражения массива неявно преобразуются из типа «N-element array of T» в «pointer to T», и выражение вычисляется по адресу первого элемента массива. В объявлении для bar
именно это и происходит.
Однако в объявлении для foo
выражение используется для инициализации содержимого другого массива и поэтому не преобразуется в тип указателя; вместо этого содержимое строкового литерала копируется в foo
.