Принимая массивы в качестве аргументов с тройными указателями

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

Пример кода:

int visit(int ***A, int i, int j, int n, int m, int size) {
(*A)[i][j] = -1;
size++;
if(i-1 >= 0 && j-1 >= 0 && (*A)[i-1][j-1] == 1) {
size += visit(A, i-1, j-1, n, m, 0);
}
if(i-1 >= 0 && (*A)[i-1][j] == 1) {
size += visit(A, i-1, j, n, m, 0);
}
if(i-1 >= 0 && j+1 < m && (*A)[i-1][j+1] == 1) {
size += visit(A, i-1, j+1, n, m, 0);
}
if(j-1 >= 0 && (*A)[i][j-1] == 1) {
size += visit(A, i, j-1, n, m, 0);
}
if(j+1 < m && (*A)[i][j+1] == 1) {
size += visit(A, i, j+1, n, m, 0);
}
if(i+1 < n && j-1 >= 0 && (*A)[i+1][j-1] == 1) {
size += visit(A, i+1, j-1, n, m, 0);
}
if(i+1 < n && (*A)[i+1][j] == 1) {
size += visit(A, i+1, j, n, m, 0);
}
if(i+1 < n && j+1 < m && (*A)[i+1][j+1] == 1) {
size += visit(A, i+1, j+1, n, m, 0);
}
return size;
}

Что значит ***A имею в виду?

0

Решение

«Пожалуйста, скажите мне разницу между функциями, принимающими массивы с использованием одинарных, двойных или тройных указателей.«

Массивы (int[] например) изменится на (int*) во время компиляции …

Например, взять целое число int some_num = 10;

Что бы вы сделали, если вдруг захотите сохранить эти числа в виде массива? int[] some_num_array = { some_num, some_num2, some_num3 }; <- Это самый общий способ сделать это …

Если вы знаете о векторы, тогда векторный эквивалент будет: std::vector<int> some_num_array{ some_num, some_num2, some_num3 }

И вы, наверное, уже знаете, что делает вектор, это контейнер который хранит значения внутри него и, конечно, он никогда не сможет хранить бесконечное значение, так как он съест вашу память и станет настолько большим, насколько ваша память сможет справиться

Это, int*** A что вы спросили, можно интерпретировать как std::vector<std::vector<std::vector<int>>>

Как вы уже можете видеть, это вектор содержащие векторы векторов

Тогда, так же, это указатель содержащие указатели указателей также…

справочный оператор (&) используется для преобразования указателя в супер-указатель и т. д. А в C / C ++ ссылка на средство означает, что другие члены и функции могут присваивать значение переменной (Помните! Вы никогда не можете присвоить переменную, никогда!) …

Если бы мы попытались преобразовать наш номер some_num выше к int***, это означает преобразование переменной без указателя в трехуровневый указатель, значение которого будет равно 5 … auto A = new int**(new int*(&some_num));

Другими словами, int*** можно назвать трехмерным указателем (массивом), так же, как вы видели двумерный массив, хранящий столбцы внутри строки (индексы).

С другой стороны, трехмерный массив хранит несколько двумерных массивов внутри себя (стороны) …

«* Что значит *** A? *»

Здесь вы можете спутать людей с термином, который известен депривязка и делает совершенно противоположную ссылку, тот факт, о котором мы говорили все это время … это дессылки (сокращение [Следовательно, использование де внутри термина] так называемый указатель уровня по одному)…

Вот так, some_num = ***A;, который просто хранит значение внутри some_num

Но, ***A = some_num;, с другой стороны, отличается, это меняет значение где угодно, но НЕ сам указатель, вот почему (const char)* не может быть разыменовано для присваивания, поскольку его разыменованное значение является постоянным символом, который это константа …… (внутри или снаружи функции)

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector