#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; }