Я правильно делаю когда трансформирую указатель в двумерный массив? Чтоб достать нужное значение.
Из этого *ukazatel[] делаю это ukazatel[0][1]
То что это работает, я вижу, но не будет ли это являться какой либо ошибкой?
Нигде такого примера не видел, всё что видел это как стороной данный вопрос обходили и поэлементно копировали массив.
int main()
{
int arr[]={1,2,3};
int *ukazatel[] ={arr};
printf("%d\n", ukazatel[0][1]);
return 0;
}
Очень удобная конструкция. Можно адреса каждого элемента доставать, можно их значения.
C/C++
Указатель превращается в двумерный массив. (Си)
Да, твой пример правилен: ты создаёшь одномерный массив указателей на одномерные массивы и работаешь с ним как с двумерным массивом. Это совершенно корректный способ создания в С/C++ и двумерных массивов, и массивов большей размерности.
При выполнении
ukazatel[0][1]
сначала к указателю ukazatel (значением массива является указатель на начало массива) применяется операция [0], которая возвращает arr (указатель). Потом к полученному указателю применяется операция [1] и возвращает значение 2.
Т. е. выполняется: *(*(ukazatel + 0) + 1)
Но если ты создаёшь переменную:
int arr2[3][7];
то в памяти создаётся одномерный массив из 21 элемента и при обращении arr2[i][j] компилятор преобразует [i][j] в индекс этого одномерного массива по формуле i * 7 + j.
Т. е. выполняется *((int*)arr2 + i * 7 + j)
Хотя внешне оба случая выглядят одинаково, внутри они работают по-разному.
При выполнении
ukazatel[0][1]
сначала к указателю ukazatel (значением массива является указатель на начало массива) применяется операция [0], которая возвращает arr (указатель). Потом к полученному указателю применяется операция [1] и возвращает значение 2.
Т. е. выполняется: *(*(ukazatel + 0) + 1)
Но если ты создаёшь переменную:
int arr2[3][7];
то в памяти создаётся одномерный массив из 21 элемента и при обращении arr2[i][j] компилятор преобразует [i][j] в индекс этого одномерного массива по формуле i * 7 + j.
Т. е. выполняется *((int*)arr2 + i * 7 + j)
Хотя внешне оба случая выглядят одинаково, внутри они работают по-разному.
не путайте создание массивов и обращение к памяти по указателям.
Обращение к ukazatel[5] по определению то же самое, что и *ukazatel+5
А многомерность - это просто указатель на указатель и т. д.
Вот с созданием многомерных массивов будет облом: они создаются как одномерные, без всяких внутренних указателей на указатели.
Если создать int arr[3][4]; то взять из него arr[1][1] можно будет только зная размерность этого двумерного массива, т. е. int* ukaz[3]=&arr[0][0]; при обращении ukaz[1][1] скорее всего не попадет в требуемый элемент, а может и прибить программу обращением к несуществующему адресу.
Обращение к ukazatel[5] по определению то же самое, что и *ukazatel+5
А многомерность - это просто указатель на указатель и т. д.
Вот с созданием многомерных массивов будет облом: они создаются как одномерные, без всяких внутренних указателей на указатели.
Если создать int arr[3][4]; то взять из него arr[1][1] можно будет только зная размерность этого двумерного массива, т. е. int* ukaz[3]=&arr[0][0]; при обращении ukaz[1][1] скорее всего не попадет в требуемый элемент, а может и прибить программу обращением к несуществующему адресу.
крестики-нолики?
0
sudo apt-get update && upgrade
0
sudo apt-get update && upgrade
Игорь Марков
Это линуксоидная команда ведь. Это на мой вопрос ответ?
Похожие вопросы
- Двумерные массивы C++, ничего не понимаю((( Нужна помощь
- Запись и чтение двумерного массива в бинарный файл
- Двумерный массив C++
- Задача.Программирование.С++.Динамический двумерный массив.
- Ввести двумерный массив A(n x m)
- Создать и вывести двумерный массив через функции
- Заполнить двумерный массив 5*3 и найти строку с максимальным произведением элементов. C++
- Отразить двумерный массив с размером m x n относительно побочной диагонали
- C++ программирование с использованием динамических двумерных массивов
- Написать фрагмент кода, где формируется двумерный массив, элементы которого могут быть тру и фолс
Мой пример правильный или в нём ошибка есть?
Вы это имели в виду?
int *ukazatel[] = { arr } В этой строчке всё правильно.
Мой пример правильный или нет?
если есть такое объявление int* ukaz[3]=&arr[0][0];
int* ukaz[3] это int* ukaz[3][1]
ukaz[1][1] это обращение ко второму несуществующему элементу массива.
Мне это надо попарктиковать ещё, но я думал уже над этим.
Вот неправильный код например
int main()
{
int arr[]={1,2,3,4,5,6};
int *ukaz[4];
ukaz[3] = &arr[0];
printf("%p\n", ukaz[1][1]);
return 0;
}
Массив arr лежит в третьем столбце массива ukaz, а я обращаюсь к первому столбцу.
Размер массива автоматически заполнился единицей. int *ukazatel[1] = { arr } ;