Почему мы должны использовать int a[][10] при передаче 2d массивов функциям?

#c #multidimensional-array

#c #многомерный массив

Вопрос:

Я хочу передать 2d-массив в функцию, и я знаю, как это сделать

 int function(int a[][10])  

Проблема в том, что мне не нравится работать с вещами, которые я не понимаю, поэтому я хотел бы понять, почему мы должны использовать «int a[][10]» вместо «int a[10][10]».

Комментарии:

1. Да, его распад в действии. Ответ говорит сам за себя, если » а » представляет какую-то концепцию в коде, я также часто использую решение, в котором я создаю структуру со значимым именем и просто добавляю массив в качестве члена. Таким образом, вы также ограничиваете свою функцию работой только с абстракцией, а не с типом.

2. По той же причине, которую вы должны использовать int function(int a[]) при передаче массива 1d.

Ответ №1:

Во-первых, параметр функции a является указателем на массив размером 10, содержащий элементы типа int . То есть параметр a не является массивом, как вы могли бы подумать.

Это называется распадом типа, как указано ниже:

За исключением случаев, когда это операнд оператора sizeof или унарного оператораamp;, или строковый литерал, используемый для инициализации массива, выражение с типом ‘массив типа’ преобразуется в выражение с типом ‘указатель на тип’, которое указывает на начальный элемент объекта массива и не является значением lvalue.

Вы спросили

почему мы должны использовать «int a[][10]» вместо «int a[10][10]».

Не имеет значения, используете ли вы int a[][10] или int a[10][10] , потому что в обоих случаях параметр a является указателем на массив размером 10, содержащий элементы типа int .

Если вы хотите передать 1D массив int элементов, вы можете использовать шаблоны, как показано ниже в версии 1:

Версия 1: Передайте массив 1D по ссылке

  #include lt;iostreamgt;  templatelt;int Ngt; int function(int (amp;a)[N])// a is a reference to a 1D array of size N having elements of type int {  return 5; //return something according to your needs }  int main() {  int arr[3] = {0};  function(arr);  return 0; }   

Версия 2: Передача 2D-массива по ссылке

  #include lt;iostreamgt;  templatelt;int N, int Mgt; int function(int (amp;a)[N][M])// a is a reference to a 2D array {  return 5; //return something according to your needs }  int main() {  int arr[10][10];  function(arr);  return 0; }