Структуры
int main()
{
struct
{
int one;
int two;
} *ps, var;
var.one = 10;
var.two = 20;
ps->one =40;
ps->two =50;
return 0;
}
var.one = работает. Объясните пожалуйста в чем проблема?
ps->one =40;
ps->two =50;
Получается, указатель на структуру может указывать только на именованный объект?
Именно так. Указатель - это просто указатель. Как только вы его создали он указывает фиг знает на что. Для того, чтобы пользоваться им, вам нужно присвоить ему адрес нужной переменной.
Нет. Он может указывать на объект, созданный как статически, так и динамически.
MyStruct* pointer;
pointer = &a; // указывает на а
pointer = &b[3]; // указывает на 3й элемент массива бэ
pointer = new MyStruct; // указывает на динамически созданный объект ( назовем номер 1), как видите, своего имени у объекта нет
pointer = new MyStruct; // создали еще один динамический объект и присвоили его адрес указателю. Теперь указатель указывает на динамический объект номер два. Объект номер один безвозвратно потерян
Нет. Он может указывать на объект, созданный как статически, так и динамически.
Спасибо, теперь понятно. Ну и , как я понял, создать динамический объект можно только в том случае, если у структуры есть имя?
Как где? delete в деструкторе std::auto_ptr =) Там дальше по коду
З.Ы. Аж хочется нормально объяснить, когда человек сам думает... Побольше бы таких:)
Да, new требует имя типа. Может, конечно, через мягкое место и можно сделать (не ручаюсь) void* f = new struct {int a; int b;}; Но за такой код могут посадить в дурку.
Кстати, раз коснулись динамической памяти: не забывайте о ее освобождении после использования. Обычно для этого используются операторы delete - для памяти, выделенной new, и delete[] для памяти, выделенной new[].
Кстати, если интересно, подумайте, что делать с таким кодом:
{
MyStruct* p = new MyStruct; // выделяем память
g(); // функция г() то генерит, то не генерит исключение
delete p; // освобождаем память. Если, конечно выполнение сюда дойдет. Если г() сгенерила исключение, то мы сюда не попадаем... И не освобождаем ничего.
}
int main()
{
try
{
f();
}
catch (...)
{
// ля ля ля
}
return 0;
}
Кстати, если интересно, подумайте, что делать с таким кодом:
Не писать.:D
Да нет, уже потрогал руками. Написал функцию вычисления корней уравнения N-й степени. N от единицы до любое. По алгоритму: если N-нечетное-находим действительный корень по Ньютону x1=x-F/F', делим на него , N=N-1; выделяем квадратичный множитель методом Хичкока, делим на него (на квадратичный член), находим корни квадратичного члена; N=N-2 и т.д. Действительные и комплексные корни. Функция получает массив коэффициентов и N. Корни возвращает в этот же массив. Ну и с массивами работал динамически. Кстати детали объявления указателя на многомерный массив у некоторых авторов или не описываются вообще, или как у Павловской довольно неудобным способом в цикле, как массив указателей. Так что только книжками не обойдешься, буду обращаться к вашему опыту.
а как же std::vector<std::vector<std::vector<... > > > ?
чем не многомерный динамический массив?
чем не многомерный динамический массив?
Я считаю, что по сути это массив векторов, так же, как и массив обычных указателей. Хотя не будем придираться к буквам, хз как назвать, работать можно и удобно.