Вопрос № 119350: Уважаемые эксперты!
подскажите пожалуйста, что означает следующая задача:
-----------------------------------------------------------------------------
постройте случайную последовательность плотность распределения которой принимает значе...Вопрос № 119363: Уважаемые эксперты, кто бы объяснил:
int x[2][2];
...
x[1][1]==*(*(x+1)+1)
Это катастрофа, этого не может быть! Понятно, что при
int **x;
x= new int* [2];
for (int i=1; i<2; i++)
{
x[i]= new int [2]; ...
Вопрос № 119.350
Уважаемые эксперты!
подскажите пожалуйста, что означает следующая задача:
-----------------------------------------------------------------------------
постройте случайную последовательность плотность распределения которой принимает значение 1/4 на отрезке [0;2] и 1/2 на отрезке [4,5].
-----------------------------------------------------------------------------
как мне это реализовать используя функцию rand языка Си. У меня компилятор Borland C3.1++
Отправлен: 19.01.2008, 22:37
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Хватов Сергей
Здравствуйте, Warobushek!
Это означает, что с вероятностью 1/2 будут возвращаться равномерно распределённые (1/2 - потому что его длина 2) значения в первом диапазоне, и 1/2 - во втором.
Приложение:
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 20.01.2008, 11:34 Оценка за ответ: 3 Комментарий оценки: за ответ по теории спасибо, но вот код программы не работает((: --функция rdouble не возвращает число в диапазоне [0..range] --где используется функция dpfun? --что означает inline ??
Вопрос № 119.363
Уважаемые эксперты, кто бы объяснил:
int x[2][2];
...
x[1][1]==*(*(x+1)+1)
Это катастрофа, этого не может быть! Понятно, что при
int **x;
x= new int* [2];
for (int i=1; i<2; i++)
{
x[i]= new int [2];
}
}
элеметов типа int - 4 и int* - 2, и в етом случае хоть x[1][1], хоть *(*(x+1)+1) одно тоже.
Отправлен: 20.01.2008, 00:57
Вопрос задал: Usernoname (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Verena
Здравствуйте, Usernoname!
Тут всё действительно в пределах нормы. Дело в том, что в памяти двумерный массив и одномерный хранятся абсолютно одинаково, язык только добавляет внешний интерфейс для скрытия сложной адресации. У Вас есть некий массив по адресу х, и этот адрес как бы указывает на первый столбец (или строку - не важно) двумерного массива. Но, при этом, он является указателем на первый элемент массива (т.е. элемент x[0][0] в адресации си). Когда Вы разыменовываете один адрес (т.е. пишете *х), то эта переменная продолжает указывать
на первый элемент массива (для нас это как бы первый элемент первого столбца (строки). В памяти всё это выглядит примерно так:
x[0][0] x[0][1] x[1][0] x[1][1]
На элемент x[0][0] указывает *x, на элемент x[1][0] - *(х+1), соответственно если прибавить ещё один *(*(х+1)+1), то мы окажемся на x[1][1].
А в Вашем примере из минифорума Вы распечатываете один и тот же адрес - адрес первого элемента в массиве (т.е. расположенного первым в памяти).
Надеюсь, Вам стало понятнее :)
--------- Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 21.01.2008, 21:33
Отвечает: Титов Михаил Анатольевич
Здравствуйте, Usernoname!
Отвечаю с учетом вашего вопроса в минифоруме.
После объявления
int x[2][2];
переменная x трактуется компилятором как указатель на массив из двух элементов типа int каждый, а не просто как указатель на указатель на int, то есть это не то же самое, что
int **y;
разница проявляется при арифметических операциях с указателями (адресная арифметика) и трактовке выражений с указателями-массивами.
Пусть sizeof(int) равно 4. Тогда выражение (y + 1) даст значение на 4 больше, чем y. Выражение (x + 1) будет иметь значение на 8 большее, чем x. То есть к x прибавиться объем, занятый одной строкой массива, то есть двумя элементами int. Компилятор четко отслеживает размер объекта на который ссылается указатель и при арифметических операциях с указателем использует это значение. Поэтому "выражение (x+1) смещает указатель на" 2 * sizeof(int).
Далее, что делает компилятор, когда встречает выражение *(*(x+1)+1) ? Вы пишите:
"... но ведь *(*(x+1)+1) фактически означает: перейти по адресу (x+1), прибавить к тому что находится по етому адрсу, полученное значение трактовать как адрес, по которуму обращаемся за результатом! "
Это ровно так бы и было, если бы х был обявлен как указатель на указатель на int (int **x). Но это не так!, x объявлен как двухмерный массив. Поэтому "*(*(x+1)+1) фактически означает:" прибавить к x размер одной строки массива, взять полученный результат, прибавить к нему размер одного элемнта массива, "полученное значение трактовать как адрес, по которуму обращаемся за результатом!"
Я думаю, что теперь вас не должно смущать, что
printf("%p", x);
printf("%p", *x); //==
выдают одинаковые результаты. Первый оператор - это адрес начала массива, второй - адрес начала первой строки массива. Эти ведь один и тот же адрес, верно?
Ответ отправил: Титов Михаил Анатольевич (статус: 5-ый класс)
Ответ отправлен: 24.01.2008, 04:53