C语言 如何更改作为参数传递的变量的值并将该值用于数组

inb24sb2  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(102)

这是我的示例代码:

#include <stdio.h>

void Func(int a[], int b) {
    a[b] = 1;
    b += 5;
}

int main(void) {
    int a[10];
    int b = 0;
    printf("%d\n", b);
    Func(a, b);
    printf("%d\n", a[0]);
    printf("%d\n", b);
}

我想让程序打印出来:

0
1
5

我试着通过将b设为指针来改变函数:

void Func(int a[], int *b)

然后写*b += 5。另外,我将函数的调用改为:

int a[10];
int *b = 0;
// ...
Func(a, &b);

是否可以操作b并使用它?

hlswsv35

hlswsv351#

void Func(int a[], int b){
   a[b] = 1; // OK
   b += 5;   // useless
}

这段代码的问题是Func正在分配b的本地副本,这在函数之外没有任何影响。
要获得预期的输出,请执行以下操作:

#include <stdio.h>

void Func(int a[], int *b) {
   a[*b] = 1;
   *b += 5;
}

int main(void) {
    int a[10];
    int b = 0;

    printf("%d\n", b);    // print value of b
    Func(a, &b);          // pass address of b to Func
    printf("%d\n", a[0]);
    printf("%d\n", b);    // print value of b again
}

Func仍然有一个名为b的本地副本,但这个副本是一个指针,可以指向main中的b对象。这允许我们用*b += 5修改指向的对象。

twh00eeo

twh00eeo2#

为此,您希望使用ab作为指针,因为a是一个数组,而b您希望修改函数内部的值。
但是你不能在函数内部直接发送b,这就是为什么你要发送&b来给予变量的存储地址,这样你就不会复制b的值,而是直接改变它。

void foo(int *a, int *b) {
    a[*b] = 1;
    *b += 5;
}

int main(void) {
    int a[10] = {0};
    int b = 0;

    printf("b = [%i]\n", b);
    foo(a, &b);
    printf("a[0] = [%i]\n", a[b]);
    printf("b = [%i]\n", b);
}

相关问题