Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/664: Рейтинг темы: голосов - 664, средняя оценка - 4.68
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
1

Как обьявить указатель на двумерный массив?

27.02.2012, 22:07. Показов 120269. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
обьясните на примере как обьявить указатель на двумерный массив и потом обращаться к элементам через указатель
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2012, 22:07
Ответы с готовыми решениями:

Как передать в функцию указатель на двумерный массив?
Есть массив int arr, как передать в функцию указатель на него, чтобы при изменения массива в...

Как правильно передать в функцию указатель на двумерный массив?
Сабж #include <windows.h> #include <stdio.h> using namespace std; //ОТ безысходности сделал...

Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
Ребята, скажите пожалуйста, как реализовать такую идею? Необходимо передать в функцию двумерный...

Указатель на двумерный массив
A эквивалентно *(*(A+i)+j). Просто давайте допустим, что у нас матрица A. Как вычислить допустим А?

22
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.02.2012, 22:16 2
C
1
2
T_data** arr;
*(*(arr + i) + j) = 5; /*eq. arr[i][j] = 5 */
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
27.02.2012, 22:21  [ТС] 3
а что это такое T_data
как создать указатель на например int mas[3][3]
0
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 22:32 4
sergeu90,
C++
1
int**pointer = &mass[3][3]
2
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
27.02.2012, 22:59  [ТС] 5
не работает так ошибку выдает
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.02.2012, 23:07 6
Цитата Сообщение от sergeu90 Посмотреть сообщение
а что это такое T_data
Тип данных. Зависит от того, какоц тип имеет ваш массив
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
int main()
{
    int arr[4][4];
    int** a = arr;
    arr[2][3] = 5;
    printf("%d\n", *(*(arr + 2) + 3));
    return 0;
}
1
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
27.02.2012, 23:12 7
Цитата Сообщение от Luke Посмотреть сообщение
int*pointer = &mass[0][0]
одна звезда лищняя

и если указывать то на начало массива &mass[0][0], а потом работать с ним
1
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
27.02.2012, 23:13  [ТС] 8
посмотрите я правильно сделал через указатель или нет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
void  main()
{
        char s[7][5][8];
 setlocale(LC_ALL,"Russian");
        std::cout << "Исходный массив:" << std::endl;
 
        srand(time(NULL));
 
        for(int m=0;m<7;m++)
        {
                for(int j=0;j<5;j++)
                {
                        for(int k=0;k<8;k++)
                        {
                                *(*(*(s+m)+j)+k)=rand() % 26 + 65;
                                std::cout << std::setw(3) << s[m][j][k];
                        }
 
                        std::cout << std::endl;
                }
 
                std::cout << std::endl;
        }
        std::cout <<"Строки с W: " << std::endl;
 
        for(int m=0;m<7;m++)
                for(int j=0;j<5;j++)
                        for(int k=0;k<8;k++)
                                if(*(*(*(s+m)+j)+k) == 'W')
                                {
                                        for(int i = 0; i < 8; i++)
                                                std::cout << std::setw(3)
                                                          << *(*(*(s+m)+j)+i);
 
                                        std::cout << std::endl;
 
                                        k = 8;
                                }
 
        system("pause");
}
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.02.2012, 23:21 9
Объявления указателя не увидел. А так вроде все нормально, за исключением 2-х моментов
Цитата Сообщение от sergeu90 Посмотреть сообщение
s[m][j][k]
Намеренно оставили обычную индексацию?

Цитата Сообщение от sergeu90 Посмотреть сообщение
k = 8;
break вместо этого.
1
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
27.02.2012, 23:22  [ТС] 10
я не могу понять как сделать по аналогии указатель на 3-х мерный массив че то не хочеот так ошибку выдает подскажите как правильно
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.02.2012, 23:25 11
Из ошибок только void main()

Добавлено через 1 минуту
Цитата Сообщение от sergeu90 Посмотреть сообщение
я не могу понять как сделать по аналогии указатель на 3-х мерный массив
C
1
char*** ptr = s
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
27.02.2012, 23:37  [ТС] 12
так я так делал не хоччет проходить

Добавлено через 37 секунд
3 IntelliSense: значение типа "char (*)[5][8]" нельзя использовать для инициализации сущности типа "char ***" e:\бнту\основы алгоритмизации\2 семестр\laba-3\laba-1\laba-1.cpp 9 17 laba-1
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.02.2012, 23:56 13
Да, точно, это же статические. Тогда так
C++
1
2
3
4
5
6
int main()
{
    int arr[4][4][4];
    int (*a)[4][4] = arr;
    return 0;
}
2
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
28.02.2012, 00:15 14
sergeu90, самое главное понять самую важную вещь. в С++ многомерные массивы - не настоящие. они все равно представляют собой одномерный массив.
например int [2][2][2]; все равно будет как int [8] в памяти лежать, а первая запись лишь языковая форма вводящая новый тип. поняв это ты придешь к простой истине, что имея указатель на 0-й элемент любого массива ты получаешь начало массива любой размерности.

поэтому int* p = &mass [0][3][5][8]; - будет показывать на определенную точку в этом многомерном массиве а int* p = &mass [0][0][0][0]; гарантирует тебе его начало. а далее игра смещений

иначе будешь использовать синтаксис монстров int (*a)[4][4]
2
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
28.02.2012, 00:30  [ТС] 15
а с символьным как просто не хочет все равно
char s[7][5][8],
char (*a)[4][4] = s; вот так

Добавлено через 12 минут
все заработало а можете обьяснить эту вот запись

Добавлено через 20 секунд
int (*a)[4][4] = arr;
0
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
27.04.2015, 00:58 16
следуя совету Luke сделал вот такой указатель. функции просто нужно передать указатель на начало и размеры массива ^_^
C++
1
2
3
4
5
6
const int h=10,l=10;
    int mass[h][l];
    int *p=&mass[0][0];
 x=6;y=9;
   
    cout<< *(p+x)+(y*l); //еквивалент mass[y][x]
0
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 36
22.02.2019, 23:26 17
тот же вопрос но с выделением динамической памяти? Как правильно написать код под двумерный массив указателей с выделением динамической памяти, потом удалением. Не могу найти правильный синтаксис. Заранее спасибо.
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 1
10.03.2019, 13:17 18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
int* addelementend(int*pArray, size_t&size, int value)
{
    int *pNewArray = new int[size + 1];
    for (size_t i = 0; i < size; i++)
    {
        pNewArray[i] = pArray[i];
 
    }
    pNewArray[size] = value;
    size++;
    delete[]pArray;
    return pNewArray;
}
 
int main()
{
    setlocale(0, "ukr");
    size_t size = 5; 
    int*pArray = new int[size];
 
    for (size_t i = 0; i < size; i++)
    {
        pArray[i] = 1;
        cout << setw(3) << pArray[i]; // setw резервирует в консоли под вывод трёх элементов
    }
    cout << endl;
 
    pArray = addelementend(pArray, size, -1);
    for (size_t i = 0; i < size; i++)
    {
        cout << setw(3) << pArray[i]; 
    }
    cout << endl;
    
}
0
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 36
18.03.2019, 20:41 19
для двумерного массива указателей все так сложно? просто не думаю что на втором семестре будут давать такие сложные лабораторки))
0
0 / 0 / 0
Регистрация: 13.04.2019
Сообщений: 28
21.06.2019, 21:32 20
Двухмерный динамический массив. По сути это и есть указатель на указатель двухмерного массива который лежит в динамической памяти.
C++
1
2
3
4
int **arr = new int*[5];
    for (int i = 0; i < 5; i++)
        arr[i] = new int[6];
delete[] arr;
Массив 5х6
0
21.06.2019, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2019, 21:32
Помогаю со студенческими работами здесь

Указатель на двумерный массив
Допустим, у меня есть функция: void A(float **b) { b=1; } Тогда почему выдает ошибку при...

указатель на двумерный массив
Делая игру морской бой, я столкнулся с 1-ой проблемой: void place_ships(char &amp;(&amp;(map+13)+29))...

Указатель на двумерный массив
хочу заменить вот такую запись: fs.read((char*)&amp;size_struct, sizeof(int));...

Указатель на двумерный массив
Возможно ли создать указатель на двумерный массив для вызова его в функции?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru