Я учился вместе со Стэнфордскими курсами по iTunes U и попал в курсоры по C ++. Я думаю, что понимаю, как работают указатели, но я просто хочу проверить, как сделать некоторые простые вещи. Допустим, я хочу создать динамический массив:
double *array;
На данный момент в стеке есть переменная с именем «массив», а в куче ничего нет. Первый вопрос - что хранится в «массиве» на данный момент? Указатель на какой-то бессмысленный кусок памяти?
Затем я выделяю память, используя «new»:
array = new double[10];
Второй вопрос - на данный момент, что хранится в «массиве»? Указатель на какой-то непрерывный фрагмент памяти, достаточно большой, чтобы вместить десять двойников? (Извините за простые вопросы, но я действительно хочу убедиться, что я понимаю)
Я присваиваю double 2.0 каждому элементу в массиве:
for(int i=0; i<array.length(); i++) array[i]=2.0;
Третий вопрос - отличается ли это от использования оператора разыменования для присваивания? (т.е. *array[i]=2.0
). Затем я передаю массив другой функции:
myFunc(double array[]){
for(int i=1; i<array.length(); i++){
array[i]=array[i]*array[i-1];
}
}
Четвертый вопрос - при переходе к myFunc, так как массив - это массив указателей на двойники, а не массив двойных, он передается по ссылке без "&", верно? Это означает, что операции в моем цикле влияют на фактические данные, хранящиеся в «массиве». Что если бы я хотел передать по значению, чтобы не касаться данных в «массиве»? Буду ли я использовать
myFunc(double *array[]){...}?
Последний вопрос - что если я по какой-то причине хотел манипулировать адресами памяти для содержимого «массива»? Могу ли я использовать
someVar = &array[5];
назначить шестнадцатеричный адрес массива [5] для someVar?
Я читал раздел об указателях в ридере и смотрел видео Бинки с дюжиной раз, и оно все еще не имеет смысла. Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: Большое спасибо всем, кто до сих пор ответил. Если вы не возражаете, у меня есть еще один вопрос. В объявлении double *array;
«массив» объявляется как указатель на двойное число, но как только я использую «новое» для его присвоения, «массив» перестает быть указателем на двойное и становится массивом двойных, верно?