Я попытаюсь нарисовать, как
int array[10][6];
и
int **array2 = malloc(10 * sizeof *array2);
for (int i = 0; i < 10; ++i)
array2[i] = malloc(6 * sizeof **array2);
выглядят в памяти и как они отличаются (и что они не могут
array
выглядит так:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | ..............| | | (10*6 elements of type int)
- - - - - - - - - - - - - - - - - - - - - -
< first row >< second row> ...
array2
выглядит так:
_ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | (10 elements of type int *)
- - - - - - - - - -
| | .... | _ _ _ _ _ _
| | \-->| | | | | | | (6 elements of type int)
| | - - - - - -
| |
| | _ _ _ _ _ _
| \ -->| | | | | | | (6 elements of type int)
| - - - - - -
|
|
| _ _ _ _ _ _
\ -->| | | | | | | (6 elements of type int)
- - - - - -
Когда вы говорите array[x][y]
, он переводится в *(((int *)array)+x*6+y)
. Хотя, когда вы говорите array2[x][y]
, он переводится в *(*(array2+x)+y)
. То есть статический 2d-массив является фактически массивом 1d с строками, помещенными в одну строку. Индекс рассчитывается по формуле row * number_of_columns_in_one_row + column
.
Динамический массив 2d, однако является всего лишь 1d массивом указателей. Затем каждый указатель динамически выделяется для указания на другой 1-й массив. По правде говоря, этот указатель может быть любым. Может быть NULL
или указывать на одну переменную или указывать на другой массив. И каждый из этих указателей устанавливается индивидуально, поэтому они могут иметь разные натуры.
Если вам нужно передать указатель array
где-то, вы не можете направить его на int **
(представьте, что бы int
значения ячеек array
интерпретируются как указатели и разыменованные -> Bam! Ошибка сегментации!). Однако вы можете думать о array
как о 1d массиве int [6]
s; это 1-й массив элементов с типом int [6]
. Чтобы записать это, вы говорите
int (*p)[6] = array;
Похоже, вы не хотите масштабировать анимацию, вам нужна анимация изменения размера. Масштабная анимация будет действовать так, как будто вы изменяете размер изображения. Анимация изменения размера должна просто влиять на параметры макета представления, не изменяя размер содержимого (только расположение).
Вы можете сделать это в XML с помощью аниматора свойств: https://developer.android.com/guide/topics/resources/animation-resource#Property
. пример анимации изменения размера в коде: https://stackoverflow.com/a/8162779/342745