Qraizer
спасибо за разъяснение!
спасибо за разъяснение!
Прекрасно компилится gcc
Код: char* pch;
char charr[10];
pch = charr;
Безусловно, массив и указатель - две разные сущности (с этим не поспоришь =) ), а вот charr и pch - следует воспринимать как одно и то же после строчки pch = char.Что значит "воспринимать как одно и то же"? Что их сущности станут одинаковыми?? И почему "после строчки"? Наверное, я отстал от новых стандартов в C++, в которых отменён принцип неизменности типа объекта, а оператор присваивания копирует тип вместе со значением...
Ну вся разница в том, что sizeof(charr)==10, а sizeof(pch)==4.И всё???
Компилятор работает так, что он преобразует обращение к charr в &charr[0],Ошибаешься. Компилятор работает по стандарту, а он говорит, что допустимо неявное кастование T[] в T const* и присваивание константых объектов неконстантным, если для них определена семантика присваивания. Поэтому ты и можешь присвоить pch=charr
а при обращении к pch - просто выдает ее содержимое, которое после приравнивания тоже будет содержать &charr[0].Не запутывайся сам, да не запутаешь и других.
Не давай себя запутать!
Что значит "воспринимать как одно и то же"? Что их сущности станут одинаковыми??Я не имел ввиду, что их сущности станут одинаковыми, я имел ввиду, что после приравнивания pch к charr, не будет разницы, обращаешся ли ты к элементам массива через pch или через charr.
. Компилятор работает по стандарту, а он говорит, что допустимо неявное кастование T[] в T const* и присваивание константых объектов неконстантнымЭто несколько абстрактная фраза и, по-моему, она еще не доказывает, что я ошибаюсь. Расскажи, что конкретно происходит при операции charr[3] = 'a'? Как работает компилятор? Ведь он рассчитывает смещение, равное 3 от адреса первого элемента?
Не запутывайся сам, да не запутаешь и других.Извини, если задел, но, мне кажется не стоило говорить, что во всех учебниках про массивы пишут ложь. Так или иначе в них доносится мысль, что имя массива можно воспринимать как указатель на его первый элемент (в некоторых, может быть, это делается плохо). И между int и float аналогия совсем не та.
aShow() {
cout<<"a: "<<a<<endl;
}
Я не имел ввиду, что их сущности станут одинаковыми, я имел ввиду, что после приравнивания pch к charr, не будет разницы, обращаешся ли ты к элементам массива через pch или через charr.Я так и подумал, но не факт, что так же подумали и другие. Поэтому и обратил твоё внимание на двусмысленность (если не сказать "ошибочность") фразы. Если получилось резковато - каюсь, не хотел.
Цитата: Компилятор работает по стандарту, а он говорит, что допустимо неявное кастование T[] в T *const и присваивание константых объектов неконстантным...
выполняется операция operator[](char const*, int) (которая эквивалентна *(operator+(char const *, int))). Неужели, эта операция вызывается по-честному? То есть, при передаче параметров по значению в функцию, в памяти создается временная переменная-указатель, содержащая значение адреса первого элемента и так же копия int. При многократных обращениях к элементам это слегка накладнее, чем operator[](char const*&, int&)
int *array[] = new int*[width];
for (int i=0; i<width; i++)
{
array[i] = new int[height];
// Если надо - инициализация
for (int j=0; j<height; j++)
array[i][j] = 0;
}
Я правильно понимаю что вначале объявляем массив динамических ссылок, а потом их самих объявляем динамическими массивами?
И насколько больше он ест памяти и почему? Объясните незнающему
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
Предыдущая тема: не знаю как назвать тему :-)