c - 结构有两个字段,每个字段都是一维数组。将结构对象传递给没有指针的函数,会改变结构对象吗?

标签 c arrays pointers struct

这是我昨天做的测试题。
考虑这段代码:

#include <stdio.h>
#define ARR_SIZE 5

typedef struct _A {
   int _arr1[ARR_SIZE];
   int* _arr2; } A;

void foo(A a) {
   int i;
   for (i=0;i< ARR_SIZE;++i)
      a._arr1[i] = 5*i;
}

void bar(A a) {
   int i;
   for (i=0;i< ARR_SIZE;++i)
   a._arr2[i] = 10*i;
}

void printA(A* a,char* str)
{
   int i;
   printf("%s:\n_arr1:\t",str);
   for (i=0;i< ARR_SIZE;++i)
       printf("%d\t",a->_arr1[i]);
       printf("\n_arr2:\t");
   for (i=0;i< ARR_SIZE;++i)
       printf("%d\t",a->_arr2[i]);
       printf("\n");
}

int main() {
    A a1 = {{1,2,3,4,5},0};
    A a2 = a1;
    a1._arr2 = a1._arr1;
    a2._arr2 = a2._arr1;
    foo(a1);
    bar(a2);
    printA(&a1,"a1");
    printA(&a2,"a2");
    return 0;
}

现在,它打印这个: a1:<br/> _arr1: 1 2 3 4 5<br/> _arr2: 1 2 3 4 5<br/> a2:<br/> _arr1: 0 10 20 30 40<br/> _arr2: 0 10 20 30 40

我看不懂这些打印品。如果我逐步配置代码,我会看到传递 a1foo不会做任何事情,因为我没有发送指向- a1 的指针.但我不明白的是为什么如果我发送 a2bar没有指针,它会改变 a2 .
我想是因为_arr2是一个指针,因此,bar改变它,所以 a2变化。但是,我们知道每个数组都是指向第一个元素的指针。所以_arr1是一个数组,所以它是一个指针,但不会改变!

有人能解释一下为什么会这样吗?提前很多 tnx!

最佳答案

bar 所做的更改在原始 struct 中可见的原因是因为 _arr2struct< 的副本中 仍然指向您已传递的原始 struct_arr1。本质上,您传递的是一个指针,只是现在它隐藏在按值传递的 struct 中。

Illustration

这是一种查看正在发生的情况的方法:

void bar(A a) {
    printf("%p %p", (void*)a._arr2, (void*)&a._arr1);
    for (int i=0;i< ARR_SIZE;++i) {
       a._arr2[i] = 10*i;
    }
}

这将为存储在 struct 中的 _arr2 和嵌入其中的 _arr1 打印不同的指针。

关于c - 结构有两个字段,每个字段都是一维数组。将结构对象传递给没有指针的函数,会改变结构对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28458660/

相关文章:

c - 将字符串解析为参数,然后连接其中的一些参数

c - 当 size_t 溢出时, "<"和 ">"运算符是否正常工作?

python - 向量矩阵乘法的标量向量乘法

c++ - C++中指向成员的指针

c - C 运行时错误中的 Split 函数

c - 理解 C 中的 printf

c - 在信号处理程序中修改全局变量时是否需要互斥锁

ios - 快速解析双 JSON 编码数组并访问它

python - Numpy "vectorized"逐行点积运行速度比 for 循环慢

c - 8 位输入给出奇怪的行为,因为 16/32 位给出小端/大端