Форум программистов, компьютерный форум CyberForum.ru

Вывод двумерного массива через указатель - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
02.02.2012, 00:35     Вывод двумерного массива через указатель #1
в пятой главе Прохоренка приведен такой фрагмент кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main()
{
   const short ROWS = 4, COLS = 5;
   int arr[ROWS] [COLS] = {
   {1,2,3,4,5},
   {6,7,8,9,20},
   {11,12,13,14,15},
   {16,17,18,19,20}
   };
   for (int *p=arr[0]; p < arr[0]+ROWS*COLS; ++p)
   cout << *p<< endl;
}
я абсолютно не понимаю, что говорится в строке
C++
1
for (int *p=arr[0]; p < arr[0]+ROWS*COLS; ++p)
получается, что в цикле фор создается указатель на целочисленнй тип данных и инициализируется адресом первого элемента массива arr. Почему запись в данной случае имеет вид
C++
1
=arr[0]
почему не
C++
1
=arr
Затем, что у нас в условии ? - p < arr[0]+ROWS*COLS
что в p и с чем оно сравнивается
Что такое ROWS*COLS и к чему оно прибавляется?
Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
02.02.2012, 01:17     Вывод двумерного массива через указатель #2
denys:
C++
1
2
1
=arr[0]
почему не
C++
1
2
1
=arr
Это все равно - указатель на 1-й элемент и указатель на массив (имя) просто равны.
Что касается адресной арифметики то:
int arr[]={1,2,3,...,20};
int *p=arr;
cout<<*p;//p - адрес первого элемента *p - первый элемент
cout<<*(p+1);//адрес первого элементa p увеличивается на размер int, и указывает на 2-й элемент
то есть если p сравнивается с адресом arr[0]+20, то компилятор сравнивает его с указателем который "правее" на 20 размеров int от начала массива...
то есть до конца.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
02.02.2012, 01:25     Вывод двумерного массива через указатель #3
denys_l, массив двумерный, arr[0] будет просто адресом первого элемента. В условии обычная адресная арифметика, выражение справа дает адрес элемента за концом массива. Но вообще сравнивать указатели — извращение.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Мне неясно почему ++p а не p++? Вроде пропускается элемент с индексом 0, т.е адресом p ...
Преобразование в любом случае выполняется в конце очередной итерации.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
02.02.2012, 01:38     Вывод двумерного массива через указатель #4
Цитата Сообщение от NoMasters Посмотреть сообщение
Преобразование в любом случае выполняется в конце очередной итерации.
И в самом деле, - забавно. Ни-когда и в голову не приходило попробовать
Yandex
Объявления
02.02.2012, 01:38     Вывод двумерного массива через указатель
Ответ Создать тему
Опции темы

Текущее время: 20:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru