fork download
  1. #include <iostream>
  2.  
  3. //аргументом функции насамом деле
  4. //является ссылка на массив, а не массив по значению
  5. void Func(int array[][3])
  6. {
  7. std::cout<<"func starting...\n";
  8. for(size_t n=0;n<4;++n)
  9. {
  10. for(size_t i=0;i<3;++i) { std::cout<< array[n][i]<<" "; }
  11. std::cout<< "\n";
  12. }
  13. }
  14.  
  15. int main()
  16. {
  17. //сначала стандартный юзкейс двухмерных массивов
  18. int a[][3] = { {1,2,3},{1,2,3},{1,2,3},{1,2,3} };
  19. Func(a);
  20.  
  21. //эквивалентный массив, только я свным указанимем размерности
  22. int b[4][3] = { {1,2,3},{1,2,3},{1,2,3},{1,2,3} };
  23. Func(b);
  24.  
  25. //эквивалент для случая работы с динамической памятью
  26. int* ptr = new int[4*3]; //выделяем на куче блок эквивалентный int[4][3]
  27.  
  28. //заполняем его теми же элементами, что и в случае с обычным двухмерным массивом
  29. ptr[0] = 1; ptr[1] = 2; ptr[2] = 3; ptr[3] = 1; ptr[4] = 2; ptr[5] = 3; ptr[6] = 1;
  30. ptr[7] = 2; ptr[8] = 3; ptr[9] = 1; ptr[10] = 2; ptr[11] = 3;
  31.  
  32. //приводим int* к типу указателя на двухмерный массив
  33. int (*pAr)[4][3] = (int (*)[4][3]) ptr;
  34.  
  35. //приведение типа указетеля на двухмерный массив, к ссылке на двухмерный массив
  36. int (&rAr)[4][3]= *pAr;
  37.  
  38. Func(rAr);
  39.  
  40. delete[] ptr;
  41.  
  42. //эквивалент для случая работы с динамической памятью, но без явного указания количества элементов
  43. {
  44. int* ptr = new int[4*3]; //выделяем на куче блок эквивалентный int[4][3]
  45.  
  46. //заполняем его теми же элементами, что и в случае с обычным двухмерным массивом
  47. ptr[0] = 1; ptr[1] = 2; ptr[2] = 3; ptr[3] = 1; ptr[4] = 2; ptr[5] = 3; ptr[6] = 1;
  48. ptr[7] = 2; ptr[8] = 3; ptr[9] = 1; ptr[10] = 2; ptr[11] = 3;
  49.  
  50. //приводим int* к типу указателя на двухмерный массив
  51. int (*pAr)[][3] = (int (*)[][3]) ptr;
  52.  
  53. //приведение типа указетеля на двухмерный массив, к ссылке на двухмерный массив
  54. int (&rAr)[][3]= *pAr;
  55.  
  56. Func(rAr);
  57.  
  58. delete[] ptr;
  59. }
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0.01s 2812KB
stdin
Standard input is empty
stdout
func starting...
1 2 3 
1 2 3 
1 2 3 
1 2 3 
func starting...
1 2 3 
1 2 3 
1 2 3 
1 2 3 
func starting...
1 2 3 
1 2 3 
1 2 3 
1 2 3 
func starting...
1 2 3 
1 2 3 
1 2 3 
1 2 3