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

Как объявлять указатели на двухмерные массивы? - C++

Восстановить пароль Регистрация
 
AnreyKazakov
Заблокирован
15.09.2012, 22:24     Как объявлять указатели на двухмерные массивы? #1
Чет связь больно близкая, по моему указатель когда указываешь на массив, он превращается в массив, только безразмерный.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
# include <iostream>
int main(){
int array[10]={5,6,8,3,23,23,23,4,23,32};
int* q=array;
std::cout<<q[5]<<std::endl;
std::cout<<array[5]<<std::endl;
int arr[10]={2,45,65,34,23,7,89,43,5,99};
std::cout<<*(arr+5)<<std::endl;
std::cout<<*arr<<std::endl;
*arr=*q;
//arr=q;
return 0;
}
Жаль, что так нельзя arr=q;

Добавлено через 7 минут
А по делу... Подскажите, пожалуйста, как на двухмерные массивы указатели объявлять? Понимаю что типа int (*q)[10]; (массив 10 на 10) но вот как он указывает?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2012, 22:24     Как объявлять указатели на двухмерные массивы?
Посмотрите здесь:

C++ Нахождение максимального элемента матрицы, минимального, суммы, произведения
C++ Сформировать массив по правилу
C++ Вычислить сумму элементов каждой строки матрицы
Нахождение наименьшего значения элемента матрицы C++
C++ Вычислить количество строк матрицы, в которых нет ни одного отрицательного элемента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.09.2012, 22:28     Как объявлять указатели на двухмерные массивы? #2
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
как на двухмерные массивы указатели объявлять?
int** arr;
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.09.2012, 10:54     Как объявлять указатели на двухмерные массивы? #3
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Жаль, что так нельзя arr=q;
есть memcpy()

Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Понимаю что типа int (*q)[10]; (массив 10 на 10) но вот как он указывает?
его шаг равен десяти элементам
q[0] - первые десять
q[1] - вторые десять
q[1][0] - первый элемент из вторых десяти
AnreyKazakov
Заблокирован
16.09.2012, 22:02  [ТС]     Как объявлять указатели на двухмерные массивы? #4
Ну а если объявить
int array[3][3]={{1,2,3},{23,32,25},{7,77,777}};
int (*q)[3]=array;
int* w=q;
Почему-то последняя строчка не присваивается...
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.09.2012, 01:56     Как объявлять указатели на двухмерные массивы? #5
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Почему-то последняя строчка не присваивается...
они разных типов

C
1
int *w = q[0];
C
1
int *w = (int *) q;
Topotun
87 / 46 / 7
Регистрация: 16.09.2012
Сообщений: 192
17.09.2012, 03:03     Как объявлять указатели на двухмерные массивы? #6
C++
1
2
3
4
5
6
7
double *arr = new double[10]; //Массив одномерный 10 чисел
//Массив двумерный (матрица) 10х10 чисел. 
double **arr2 = new double*[10];
for(int i = 0; i < 10; i++)
{
     arr2[i] = new double[10];
}
Чет связь больно близкая, по моему указатель когда указываешь на массив, он превращается в массив, только безразмерный.
Связь близкая, но в тоже время далёкая. Указатель на массив это не безразмерный массив и это вообще не массив и даже близко нету к массиву. Указатель на массив хранит в себе АДРЕС первого элемента массива. Зная адрес первой ячейки массива, можно уже с помощью итератора переходить по остальным элементам. Объявляя массив (не указатель), память сразу же резервируется под необходимые элементы, а создавая указатель, память можно динамически варьировать, в зависимости от того, сколько нам нужно под конкретную задачу.
AnreyKazakov
Заблокирован
17.09.2012, 09:58  [ТС]     Как объявлять указатели на двухмерные массивы? #7
Цитата Сообщение от accept Посмотреть сообщение
1
int *w = (int *) q;
Вот так получилось объявить
C++
1
2
3
4
5
6
7
8
#include <iostream>
int main(){
    using std::cout;using std::cin;using std::endl;
    int array[3][3]={{1,2,3},{23,32,25},{7,77,777}};
    int (*q)[3]=array;
    int* w=(int*)q;
    cout<<w[2]<<endl;
    }
Но, сколько не прибавляешь ++q , значение *w не изменяется, то есть
q=0;// а *w=1;
++q;// а *w все равно равно 1
int* w=(int*)q; не совсем понял, что означает это присваивание....

Цитата Сообщение от Topotun Посмотреть сообщение
double *arr = new double[10];
это я понял, объявили динамически массив из 10 элементов
Цитата Сообщение от Topotun Посмотреть сообщение
double **arr2 = new double*[10];
А вотэто нифига не понятно **arr2 - т к две звездочки, значит arr2 указатель на указатель, new double объявляем динамически... а что объявляем? вот это... *[10] - и тут я вообще теряюсь в догатках, самым логичным предположением было то, что arr - указатель на массив указателей из 10 элементов каждый (с шагом в 10)
тогда что в этом цикле ?
Цитата Сообщение от Topotun Посмотреть сообщение
for(int i = 0; i < 10; i++)
{
* * *arr2[i] = new double[10];
}
Здесь объявляются 10 указателей на массивы из 10 элементов?, а они разве не создались здесь автоматом? **arr2 = new double*[10]; ???
Вот такие вот вопросы........... =(
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.09.2012, 10:42     Как объявлять указатели на двухмерные массивы? #8
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Но, сколько не прибавляешь ++q , значение *w не изменяется
указатель - это обычная переменная, в которой хранится число типа "адрес"
++q равно q = q + 1 - в q записывается новый адрес

w и q никак не связаны, в них просто хранится один и тот же адрес

Цитата Сообщение от AnreyKazakov Посмотреть сообщение
не совсем понял, что означает это присваивание
там операция приведения типа (в C++ используются операторы с суффиксом cast)
тип данных из переменной-указателя приводится к нужному, и эти данные помещаются в новую переменную-указатель

C++
1
int *arr[10];
это массив из десяти указателей
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2012, 12:25     Как объявлять указатели на двухмерные массивы?
Еще ссылки по теме:

Сформировать матрицу по правилу C++
C++ Посчитать произведение в тех рядках матрицы, в которых нет минусовых чисел
C++ Указатели на функцию - как их использовать, как объявлять

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
17.09.2012, 12:25     Как объявлять указатели на двухмерные массивы? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Вот так получилось объявить
А вотэто нифига не понятно **arr2 - т к две звездочки, значит arr2 указатель на указатель, new double объявляем динамически... а что объявляем? вот это... *[10] - и тут я вообще теряюсь в догатках, самым логичным предположением было то, что arr - указатель на массив указателей из 10 элементов каждый (с шагом в 10)
тогда что в этом цикле ?

Здесь объявляются 10 указателей на массивы из 10 элементов?, а они разве не создались здесь автоматом? **arr2 = new double*[10]; ???
Вот такие вот вопросы........... =(
нет, не создались.

матрица это массив массивов.
в цикле этом:
C++
1
2
3
4
for(int i = 0; i < 10; i++)
{
*arr2[i] = new double [10]; // так будет правильнее
}
ты указываешь компухтеру, что в каждой ячейки твоего созданного, еще пока одномерного массива, будут еще массивы указателей. и на выходе получишь матрицу
Yandex
Объявления
17.09.2012, 12:25     Как объявлять указатели на двухмерные массивы?
Ответ Создать тему
Опции темы

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