Разница между C &C++
1)в чем разница между
char *STR="hello";
и char arr[]="hello"
;2 )в чем разница между структурой c++ и структурой c??? :)
xenotron
И STR, и arr выделяют массив символов в глобальной области памяти или в стеке, содержащем символы в стеке. Разница:
1. arr: arr-это идентификатор, значение которого является константой, для самого значения arr не выделена переменная. Когда вы используете arr в своем коде, компилятор "жестко кодирует" эту константу. (Под капотом это не обязательно константа, когда машинный код генерируется для смещения независимого материала и когда расположение массива является относительной областью памяти стека, но это проблема генератора кода, с вашей точки зрения (с точки зрения пользователя языка) arr-это постоянное значение без выделенной переменной/хранилища.)
- STR: в случае этого объявления помимо массива символов компилятор также выделяет для вас переменную char* и инициализирует ее для вас по адресу массива символов (к постоянному значению, которое является тем же значением, к которому вы обращаетесь с символом arr в предыдущем примере). Очень большая разница по сравнению с arr заключается в том, что STR здесь сама по себе является переменной-указателем, которую вы можете изменить позже в своем коде, вы не можете сделать этого с константой arr.
Еще одно очень большое различие: тип символов STR и arr. Тип STR - char*, а тип arr-char[]. Разница часто невидима, потому что компиляторы C/C++ содержат очень уродливый Хак (на мой взгляд): идентификаторы массивов (arr) во многих случаях автоматически преобразуются в указатели. Например, если вы говорите char* myvariable = arr; то компилятор автоматически преобразует тип arr в указатель, указывающий на arr.
оператор sizeof тоже есть сюрпризы: оператор sizeof(STR), который совпадает с размером sizeof(Void*) в качестве STR-это указатель переменной и sizeof(Арр) даст вам размер символьного массива, а arr-это массив символов. Однако если вы объявите функцию типа:
void myfunc(char array_param[])
{
}
тогда sizeof(array_param) - это sizeof(void*), поскольку параметры массива на самом деле являются указателями, параметры массива никогда не передаются по значению, даже если вы указываете точный размер параметра массива!!! Вы можете принудительно установить фиксированный размер для входящего параметра массива с помощью ключевого слова static (я никогда не использовал его, просто видел в странном примере...)
Уродливые сходства между массивами и указателями не должны существовать в C/C++, современные языки устранили их, чтобы предотвратить ошибки программирования, но C / C++, вероятно, сохранит их навсегда из-за обратной совместимости.