【发布时间】:2021-11-21 22:57:56
【问题描述】:
我对使用指针和数组的规则有一些疑问,因为我对传递数组的规则有点困惑。
void f1(int* x, int* y) {
int * ptr = x;
x = y;
y = ptr;
}
void f2(int* x, int* y) {
int val = *x;
*x = *y;
*y = val;
}
void f3(int* x, int* y) {
int val = *x;
x = y;
y = &val;
}
假设我有两个数组,a[3] = {0,2,4} 和 b[3] = {1,3,5}。
如果我运行 f1(arr_a, arr_b); 和 printf("%d\n", *arr_a); 行,它将打印出 0。我假设这是因为你只是将数组的指针传递给函数,它只是数组的副本,所以实际上没有任何修改。这个假设是否正确?
现在,如果我运行f2(arr_a + 1, arr_b + 1) 和printf("%d\n", *(arr_a + 1));,它的值会是3,这是因为我这次没有使用指针,所以我直接使用了一个整数(val),它被设置为等于索引为 1 处的数组的值,并交换这些值。我假设是因为这手动更改了地址,不像第一个函数,它使用一个指针,它是数组的副本?
最后,对于第三个,如果我运行 f3(arr_a + 1, arr_b + 1) 和 printf("%d\n", *(arr_a + 1));,x 的值应该是 2,y 的值应该是 3,因为 x 没有与 y 交换,因为没有使用 * 运算符(所以地址不交换),并且 y 被设置为 val 的地址,这是一些随机地址,也不管不交换?
谢谢
【问题讨论】: