Суть в том, что массивы распадаются на указатели на их первый элемент автоматически, если передаются функциям. Так что вы просто вызываете свою функцию как
int_copy(A, B, 3);
Взятие адреса массива возможно , и поскольку массивы и их первый элемент всегда имеют один и тот же адрес, получат одинаковое числовое значение. но тип указателя отличается, это не будет указатель на int, это будет указатель на массив int длиной 4:
int(*pointer)[4] = &A;
Синтаксис ужасен, я знаю ...
Я хочу вывести 6,7,8,4 для массива A
Предположим, поэтому вы сначала взяли резервную копию ptrA
? Исключительно, вы не используете это ...
printf("%d\n", *ptrA);
printf("%d\n", *ptrB);
Эти два оператора будут печатать только одно целое число, на которое указывают два указателя. Когда вы продвинете их обоих на 3 уже в цикле, они будут распечатаны
4
и 9
.
Вам потребуется использовать указатель резервной копии p
и выполнить итерацию в другом цикле ровно по четырем элементам. Исключительно: ваша функция копирования не может знать о количестве элементов массива. Печать таким способом возможна при некоторых ограничениях, но это опасный код. Представьте, что произошло, если вы передали указатель куда-то посередине массива (-> неопределенное поведение из-за чтения за пределами массива!).
Безопасным способом было бы не печатать в вызываемой функции, а:
int main(void)
{
int_copy(&A, &B, 3);
for(size_t i = 0; i < sizeof(A)/sizeof(*A); ++i)
printf("%d ", A[i]);
}
Наконец: вам не нужно явно return
в void-функциях (только если вы хотите преждевременно завершить работу ...).