2012-05-26 4 views
1

Ниже приведен кодТип указателя массива

void printLoop(type?? p){ 

for(int i = 0; i<2;i++) 
{ 
    for(int e = 0;e<3;e++) 
     { 
      cout<<p[i][e]<<" "; 
     } 
     cout<<"\n"; 
    } 
} 
void array() 
{ 
int a[2][3] = {{1,2,3},{4,5,6}}; 
int (*p)[3] = a; 
printLoop(p); 
} 

Основная идея заключается в том, что я хочу, чтобы распечатать массив, используя для цикла в FUNC printLoop. Однако мне нужно знать тип этого указателя, который имеет адрес двумерного массива. Какой тип указателя? Это int (*)[]? Я смущен.

И что значит «(*p)» означает (от int (*p)[3])? Большое спасибо!

+0

Это действительно хорошо читается: http://c-faq.com/decl/spiral.anderson.html. Из этого, работая против часовой стрелки, вы можете видеть, что 'p' является указателем' * 'на массив' [] '' '' '' '' '' '' '' '' ''. – chris

ответ

4

что означает "(* p)" означает (из int (* p) [3])?

p представляет собой указатель на массив размера 3 объектов типа int.

У вас есть несколько possibilites для вашей printLoop функции (хотя и с общим C-ограничением, что вы можете оставить не более одного - внешний описатель пуст):

  • Вы можете указать размеры в явном виде:

    void printLoop(int p[ 2 ][ 3 ]);

Единственное преимущество этого метода состоит в том, что осуществление может считать, что передаваемый массив имеет желаемый размер (т.е. 2x3 матрицы int s) в качестве предварительного условия.

  • Вы можете оставить часть [2] целиком:

    void printLoop(int p[][ 3 ]);

или

void printLoop(int (*p)[ 3 ]); 
  • Вы можете использовать указатель на указатель int

Вам также необходимо передать размеры (если вы пропустите тот, который есть), чтобы убедиться, что вы не получаете доступ к памяти за пределами границ. Итак, ваша подпись функции должна выглядеть так:

void printLoop(int (*p)[ 3 ], int dim); 
+0

Первое измерение будет потеряно в любом случае, независимо от того, вы его определяете или нет. Массив для уклонения указателя также включается в аргументы функции. –

+0

@ K-ballo: Да. Но подпись работает как * вид документации * для того, чтобы исполнитель мог принять вольности. – dirkgently

+0

Большое спасибо. Теперь я лучше понимаю, что происходит! – whileone

3

Для функции printLoop, int p[2][3] в качестве аргумента должен работать.

int (*p)[3] = a; 

p является указателем на массив от 3 int s, инициализированных до a.

2

Прежде всего, ваш код не очень современный C++. Это в основном «c с iostreams».

Прежде всего, printLoop(int p[2][3]) - это подпись, которую вы ищете, хотя и снова, это не лучший способ делать вещи вообще.

В первую очередь, int (*p)[3] анализируется следующим образом: Начните с имени p и взгляните вокруг (сначала вправо, , В нем есть только звезда, поэтому вы можете сказать, что p является указателем. Теперь вы рекурсивно повторите тот же анализ, вы видите [3], что означает, что p является указателем на массив, который имеет 3 int s.

Теперь я хотел бы отметить следующее:

Использование std::array для статически размера массивов.
Использовать std::vector для массивов динамического размера.

О, также я сам не буду использовать 2D-массив, они неуклюжи и просто синтаксический сахар (вокруг основного понятия «массив», который также является синтаксическим сахаром).

Так что, возможно, что-то вроде этого, составленное мозг, надеюсь, правильно, C++ 11 злоупотребляя:

std::array<int, 3 * 2> p = {{1, 2, 3, 4, 5, 6}}; 
std::for_each(std::begin(p), std::end(p), [](int elem){ std::cout<<elem; }); 

Ницца и денди. Вы также можете иметь лямбда-чек для некоторых размеров «2-мерного массива» и вставлять новые строки, если хотите.

Смежные вопросы