Принимая массивы в качестве аргументов с тройными указателями - PullRequest
0 голосов
/ 13 октября 2018

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

Пример кода:

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?

1 Ответ

0 голосов
/ 13 октября 2018

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

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

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

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

Если вы знаете о векторах ,тогда векторный эквивалент будет: 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? *"

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

Например, some_num = ***A;, что простохранит значение A внутри some_num

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...