Есть ли другой способ просто манипулировать указателями?
Нет, потому что animal
не указатель. animal
это массив. Когда вы передаете его в качестве аргумента функции, он распадается на указатель на свой первый элемент, как если бы вы сказали &animal[0]
.
Даже если вы используете указатель и берете указатель на него в funct
, он все равно не будет работать:
void funct(unsigned char** elf)
{
unsigned char fish[2] = { 3, 4 };
*elf = fish; // oh no!
}
int main()
{
unsigned char animal[2] = { 1, 2 };
unsigned char* animal_ptr = animal;
funct(&animal_ptr);
}
После строки с надписью "о нет!" массив fish
перестает существовать; он уходит, когда funct
возвращается, потому что это локальная переменная. Вы должны будете сделать его статическим или динамически распределить его, чтобы он еще существовал после возврата из функции.
Несмотря на это, оно все равно не то, что вы хотите, потому что оно никогда не модифицирует animal
; изменяется только там, где animal_ptr
указывает на
Если у вас есть два массива и вы хотите скопировать содержимое одного массива в другой, вам нужно использовать memcpy
(или свернуть свою собственную memcpy
-подобную функцию, которая копирует элементы массива в цикле или в последовательности или однако).