2014-11-25 2 views
2

Рассмотрим следующую программу C:Передача массива в функцию в C

#include <stdio.h> 

void swap(int []); 

int main(void) { 
    int a[3] = {1, 2, 3}; 
    swap(a); 
    printf("%d %d %d\n", a[0], a[1], a[2]); 
    swap(&a[1]); 
    printf("%d %d %d\n", a[0], a[1], a[2]); 
    return 0; 
} 

void swap(int x[]) { 
    int temp = x[0]; 
    x[0] = x[1]; 
    x[1] = temp; 
} 

Может кто-нибудь объяснить, почему следующий код дает выход
2 1 3
2 3 1

вместо
2 1 3
1 2 3

Я понимаю, что swap(a) свопы a[0] и a[1]. Но я не уверен, как работает swap(&a[1]). В обоих случаях мы передаем массив a в функцию swap, не так ли? Таким образом, моя гипотеза заключалась в том, что swap(&a[1]) должен снова обменять a[0] и a[1], дав нам прежний заказ 2 3 1.

EDIT: Этот код был написан как предполагалось. Я просто хотел посмотреть, что произойдет, если мы передадим адрес элемента, отличного от первого элемента, в функцию. По-видимому, если я передаю &a[n] в функцию, он игнорирует все элементы до a[n] и обрабатывает a[n] в качестве первого элемента?

+0

Да, я понимаю. Но как именно работает 'swap (& a [1])? Другими словами, что происходит, когда мы передаем в функцию адрес, который не является первым элементом? Оказывает ли это выражение '& a [1]' как адрес первого элемента? – Vizuna

+0

change swap (& a [1]) для обмена (& a [0]) –

ответ

1

Ваша функция подкачки принимает и адрес целого в качестве входного и своп-элемента по этому адресу с элементом по следующему адресу.

swap(a) is same as swap(&a[0]) 
It will swap element at index 0 with element at index 1. 
Now your array becomes {2,1,3} 
swap(&a[1]) swaps element at index 1 with element at index 2. 
So your array now becomes {2,3,1} 

Помните, когда вы передаете массив на самом деле вы передаете адрес элемента с индексом 0 (&a[0]).

+0

Итак, когда я передаю '& a [1]' в функцию, он обрабатывает '& a [1]' как будто это '& a [0]'? Поскольку в определении функции 'swap', это явно указывает на замену элементов с индексом 0 и 1. – Vizuna

+0

@Vizuna: когда вы передаете массив функции, он распадается на указатель. Ваша сигнатура функции такая же, как и «void swap (int * x)». Таким образом, функция предполагает, что указатель имеет по меньшей мере два последовательных 'int' и свопирует значения в' * (x + 0) 'и' * (x + 1) '. – Blastfurnace

+0

Да, когда вы передаете '& a [1]' 'x [0] так же, как и [1]'. Значит, ваш 'x' (массив в' swap'-функции) начинается с индекса 1 'a' (массив в' main') –

0

Поскольку при первом обмене вы отправили массив, начинающийся с индекса 0, он обменивается 0-м и 1-м значениями индекса при первом обмене, массив становится {2,1,3}, после чего вы отправили этот массив, начиная с 1 индекса означает, что вы отправили только два значения {1,3}, затем эти значения получают обмены. В этом случае x [0] = 1 & x [1] = 3, поэтому выход пришел как {2,3,1}, здесь 2 остается таким, какой он есть.

0

В первом вызове swap(a); вы передаете весь массив (на самом деле указатель на первый элемент.) Таким образом, вы меняете элементы 0 и 1, которые равны 1 и 2 соответственно, поэтому ваш первый вывод равен 2 1 3.

Во втором вызове swap(&a[1]); вы передаете адрес второго элемента в массиве, а в своей функции swap вы меняете второй и третий элементы по индексам 1 и 2, которые равны 1 и 3 соответственно , Вот почему ваш ответ после второй итерации 2 3 1.

Возможно, что вы имели в виду был

swap(&a[0]); 

Это будет поменять местами значения с индексами 0 и 1, что даст вам желаемый выход 1 2 3.

+0

Er, вы правы. Исправлена. –

0

В вашем коде перед первым утверждением println вы передаете полный массив параметру fuction, но в следующем вы просто передаете единственное значение местоположения [1], которые делают бит запутанным для функции, потому что у него есть только одно значение для свопинга, или это может быть так, как сначала вы передали индекс нуля (0) или массив для обмена с последующим переходом первого индекса индекса для обмена, с помощью которого [1,3 для обмена] так пройти полный в следующем даного как это

swap(a); 
printf("%d %d %d\n", a[0], a[1], a[2]); 
swap(a); 
printf("%d %d %d\n", a[0], a[1], a[2]); 
return 0; 

этого будет генерировать ваше желание ответа

Смежные вопросы