2012-04-15 7 views

ответ

6

Простой ответ заключается в том, что вы не можете. Двумерный массив представляет собой непрерывный блок памяти, который содержит каждую строку, а указатель на указатель может ссылаться на ячейку памяти, где указатель на другую ячейку памяти, содержащую целые числа.

С другой стороны, вы можете создать отдельную структуру данных, содержащую указатели на элементы так, как вы хотите (т. Е. Создать массив указателей, инициализировать эти указатели в начале каждой строки и использовать указатель на этот массив указателей как pointer), но это совсем не полезно, а скорее усложнит все ненужное.

Вопрос, вероятно, исходит из распространенных заблуждений о том, что массивы и указатели являются одинаковыми, которыми они не являются. Массив может распадаться на указатель на первый элемент массива (и будет делать это довольно часто), но тип этого указателя является типом первого элемента. В двумерном массиве типом первого элемента является внутренний массив, а не тип базового элемента.

+0

ОК спасибо очень, я знаю, что массив сам по себе является указателем например, arr [2] может иметь дело с ним как * arr * (arr + 1) = 3 Как я могу сделать то же самое, но с двухмерным массивом? arr [3] [2], могу ли я сказать ** arr = 0 и т. Д. –

+0

@AhmedZainElDein: НЕТ, вы ошибаетесь, и это распространенное заблуждение. Массив ** не ** указатель на первый элемент, они совершенно разные типы, даже если есть неявное преобразование из массива в указатель на первый элемент. Как только вы действительно поймете, что они не * то же самое, вам будет легче понять, почему то, о чем вы просите, не может быть сделано. Другой способ взглянуть на это - это рисовать макет памяти двумерного массива (один блок из элементов размера N * M), а затем понять, что внутри этого блока нет указателя, поэтому вы не можете создать указатель на него –

+0

спасибо u для просветления меня .я больше склоняюсь к тому, что вы говорите, потому что я не могу найти, чтобы сделать ** arr ссылку на arr [3] [2] на всех , но это заставляет меня задавать другой вопрос, что в одном массиве он работает int arr [2], я могу сказать * arr = 0; * (arr + 1) = 3 –

16

Объявите указатель, как это:

int (*pointer)[3] = array; 

Но это бесконечно противный в C++. Возможно, вы могли бы найти лучшее решение (одно с участием векторов и еще много чего), если бы вы объяснили, какова ваша общая цель.

+0

Согласен. STL сэкономит много головной боли. – chris

+0

Это не то, что я хочу на ll, это одномерный массив спасибо u для ура усилия –

+0

@AhmedZainElDein: то, что вы хотите, невозможно сделать, и это подход, чтобы обеспечить что-то, что будет * источником * совместимым с тем, что вы *хотеть*. –