Пятница, 29 Марта 2024, 08:35

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Форум игроделов » Программирование » C/C++ » #if
#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
почетный гость
Сейчас нет на сайте
Хм... В общем при такой записи:
Code
int A[10];

в памяти создаётся массив, а в A заносится указатель на 0-ю ячейку. А как тогда осуществляется это:
Code
cout << A[5];


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). А что здесь * делает? Извините, если туплю biggrin

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, единомышленник biggrin

Правда я еще всем K&R советую, хоть она и по Си, но все же хороша и там есть ответы на заданые в теме вопросы.



HagraelДата: Пятница, 14 Января 2011, 14:15 | Сообщение # 59
почетный гость
Сейчас нет на сайте
Quote (ezhickovich)
C++ Без страха

Щас посмотрим, что за вещь.

Добавлено (14.01.2011, 14:15)
---------------------------------------------
Кст., за книгу спасибо, интересно и просто написана. Но т. к. в ней написаны не все нюансы, за ними я буду приходить сюда =)


ezhickovichДата: Пятница, 14 Января 2011, 14:16 | Сообщение # 60
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (Hagrael)
Но т. к. в ней написаны не все нюансы, за ними я буду приходить сюда =)

На все вопросы уже есть ответы... (угадай где...)



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
Форум игроделов » Программирование » C/C++ » #if
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг