#if
|
|
GECK | Дата: Вторник, 11 Января 2011, 18:41 | Сообщение # 41 |
заслуженный участник
Сейчас нет на сайте
| Hagrael, ** буквально означает указатель на указатель. Т.к. любой массив - это указатель на первый элемент, получается что это двумерный массив. Добавлено (11.01.2011, 18:41) --------------------------------------------- Kornival, опередил) Верно говоришь, про статические я забыл сказать.
Всё гениальное просто. И хреново работает.
|
|
| |
Hagrael | Дата: Среда, 12 Января 2011, 13:41 | Сообщение # 42 |
почетный гость
Сейчас нет на сайте
| Начал читать статью про указатели и ничего не понял. Любой массив - указатель на первый элемент массива... ?! То есть на самом деле массив указывает на 0-ю ячейку массива... А в ячейке этой что написано какому массиву она принадлежит? о_О
|
|
| |
Matou | Дата: Среда, 12 Января 2011, 14:09 | Сообщение # 43 |
Исходный коТ
Сейчас нет на сайте
| Quote (Hagrael) Начал читать статью про указатели и ничего не понял. Любой массив - указатель на первый элемент массива... ?! То есть на самом деле массив указывает на 0-ю ячейку массива... Имя массива является константным указателем на первый элемент массива. Например: Code int A[10]; // какбэ массив из 10 целочисленных элементов, от 0 до 9 int* p; // какбэ указатель на целочисленную переменную
p = A; // теперь р и A тождественны при выполении каких-либо действий
p[9] = 8; // присвоить последнему элементу 8 A[9] = 8; // тоже самое
*(p + 2) = 9; // присвоить третьему элементу 9 *(A + 2) = 9; // тоже самое
// а вот единственное различие
p += 2 // можно A += 2 // нельзя, константа жеж ну просто же Quote (Hagrael) А в ячейке этой что написано какому массиву она принадлежит? о_О Неа, ниче там не написано.
|
|
| |
Hagrael | Дата: Среда, 12 Января 2011, 14:22 | Сообщение # 44 |
почетный гость
Сейчас нет на сайте
| Хм... В общем при такой записи: в памяти создаётся массив, а в A заносится указатель на 0-ю ячейку. А как тогда осуществляется это:
|
|
| |
ezhickovich | Дата: Среда, 12 Января 2011, 14:57 | Сообщение # 45 |
[Великий и могучий хозяинъ]
Сейчас нет на сайте
| A + 5*sizeof(int)
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
|
|
| |
Matou | Дата: Среда, 12 Января 2011, 15:21 | Сообщение # 46 |
Исходный коТ
Сейчас нет на сайте
| Quote (ezhickovich) A + 5*sizeof(int) Это то что на самом деле происходит, но писать так в коде не имеет смысла т.к. в арифметике указателей операция масштабирование (*sizeof(type)) происходит автоматически. Quote (Hagrael) в памяти создаётся массив, а в A заносится указатель на 0-ю ячейку. А как тогда осуществляется это: cout << A[5]; Операция A[5] эквивалентна операции *(A + 5). Ну просто жеж)
Сообщение отредактировал Matou - Среда, 12 Января 2011, 15:26 |
|
| |
Hagrael | Дата: Среда, 12 Января 2011, 15:30 | Сообщение # 47 |
почетный гость
Сейчас нет на сайте
| Такс. Массив - это на самом деле указатель на первую ячейку, и когда мы пишем A[5], на самом деле выполняется операция *(A+5). А что здесь * делает? Извините, если туплю
|
|
| |
Matou | Дата: Среда, 12 Января 2011, 15:36 | Сообщение # 48 |
Исходный коТ
Сейчас нет на сайте
| * - операция разыменования. Переменная p (int* p), это указатель, чтобы получить переменную на которую он указывает его надо разыменовать *p. p - возвращяет указатель *р - возвращяет переменную на которую указывает указатель.
Сообщение отредактировал Matou - Среда, 12 Января 2011, 15:36 |
|
| |
Hagrael | Дата: Среда, 12 Января 2011, 15:39 | Сообщение # 49 |
почетный гость
Сейчас нет на сайте
| Matou, большое спасибо, понял, но 2 ** тогда что означают?
|
|
| |
Matou | Дата: Среда, 12 Января 2011, 16:42 | Сообщение # 50 |
Исходный коТ
Сейчас нет на сайте
| Указатель на указатель же)) Code int* A[10]; // делаем массив из 10 указателей на целые int** p; // делаем указатель на указатель
//теперь можно присвоить елементам массива начала каких-нить других массивов
int B[10]; // массив из 10 целых
A[3] = B; // четвертый елемент массива А содержит указатель на начало массива B
p = A; // p содержит указатель на первый элемент массива A, при том что массив А состоит из указателей // т.е. p содержит указатель на указатель.
// теперь можно получать доступ к массиву B через указатель p
**(p + 3) = 10; // присвоить первому елементу B значение 10
*(*(p + 3) + 3) = 20; // присвоить четвертому елементу из B значение 10 Ну и т.д. Просто жеж) и кстати Code p[3][0] = 10; // тоже что и **(p + 3) = 10 p[3][3] = 20; // тоже что и *(*(p + 3) + 3) = 20
Сообщение отредактировал Matou - Среда, 12 Января 2011, 16:55 |
|
| |
Hagrael | Дата: Среда, 12 Января 2011, 17:12 | Сообщение # 51 |
почетный гость
Сейчас нет на сайте
| Не могу понять строки: Code void initGame(bool **map);
bool **map = new bool*[20];
void initGame(bool **map) {...}
|
|
| |
Matou | Дата: Среда, 12 Января 2011, 17:46 | Сообщение # 52 |
Исходный коТ
Сейчас нет на сайте
| Да вроде все обьяснил, почитай подумай и поймешь.
|
|
| |
Hagrael | Дата: Среда, 12 Января 2011, 18:46 | Сообщение # 53 |
почетный гость
Сейчас нет на сайте
| Я вот так понимаю: Code void initGame(bool **map); //в initGame посылаются значения указателей map'a о_О
bool **map = new bool*[20]; //значнеия указателей <img src="http://s12.ucoz.net/sm/1/wacko.gif" border="0" align="absmiddle" alt="wacko"> Ничё не понял
void initGame(bool **map) {...} // Здесь также принимаются ЗНАЧЕНИЯ указателей, а ведь должен на самом деле передаваться массив - сам указатель. Или нет?
|
|
| |
GECK | Дата: Среда, 12 Января 2011, 19:05 | Сообщение # 54 |
заслуженный участник
Сейчас нет на сайте
| По-моему так: Code void initGame(bool **map); //посылается указатель на map[0][0](сам массив). Фишка в том, что из него можно получить доступ к любому его элементу.
bool **map = new bool*[20]; //просто выделение памяти под массив указателей из 20ти элементов
void initGame(bool **map) {...} //здесь передается тоже массив. Ведь передавая массив ты передаешь все его элементы.
Всё гениальное просто. И хреново работает.
|
|
| |
ezhickovich | Дата: Среда, 12 Января 2011, 20:47 | Сообщение # 55 |
[Великий и могучий хозяинъ]
Сейчас нет на сайте
| Hagrael, Хватит тупых вопросов, учи C++... (не надо начинать сразу с игр!)
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
|
|
| |
Hagrael | Дата: Четверг, 13 Января 2011, 12:50 | Сообщение # 56 |
почетный гость
Сейчас нет на сайте
| Quote (ezhickovich) Hagrael, Хватит тупых вопросов, учи C++... (не надо начинать сразу с игр!) Да я и учу "C++. От основ до игр". А можете кинуть ссылку на другой онлайн-учебник по C++? Я прогуглил всё, ничего не нашёл. Quote (GECK) void initGame(bool **map); //посылается указатель на map[0][0](сам массив). Фишка в том, что из него можно получить доступ к любому его элементу. Но ведь при * должно посылаться значение, а не указатель. Ладно, почитаю статьи, попытаюсь понять.
|
|
| |
ezhickovich | Дата: Четверг, 13 Января 2011, 19:09 | Сообщение # 57 |
[Великий и могучий хозяинъ]
Сейчас нет на сайте
| Hagrael, Я начинал с "C++ Без страха" (не смотря на название, книга хорошая) А вообще лучше учиться по Страуструпу... (моё мнение)
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
|
|
| |
Matou | Дата: Пятница, 14 Января 2011, 03:21 | Сообщение # 58 |
Исходный коТ
Сейчас нет на сайте
| ezhickovich, единомышленник Правда я еще всем K&R советую, хоть она и по Си, но все же хороша и там есть ответы на заданые в теме вопросы.
|
|
| |
Hagrael | Дата: Пятница, 14 Января 2011, 14:15 | Сообщение # 59 |
почетный гость
Сейчас нет на сайте
| Quote (ezhickovich) C++ Без страха Щас посмотрим, что за вещь.Добавлено (14.01.2011, 14:15) --------------------------------------------- Кст., за книгу спасибо, интересно и просто написана. Но т. к. в ней написаны не все нюансы, за ними я буду приходить сюда =)
|
|
| |
ezhickovich | Дата: Пятница, 14 Января 2011, 14:16 | Сообщение # 60 |
[Великий и могучий хозяинъ]
Сейчас нет на сайте
| Quote (Hagrael) Но т. к. в ней написаны не все нюансы, за ними я буду приходить сюда =) На все вопросы уже есть ответы... (угадай где...)
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
|
|
| |