结构有两个字段,每个字段都是一维数组。将结构对象传递给没有指针的函数,会改变结构对象吗?
Struct has two fields , each one is an 1d array. Passing the struct object to a function without pointer , would change the struct object?
这是我昨天做的测试题。
考虑这段代码:
#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
我看不懂这些印刷品。如果我逐步配置代码,我会看到将 a1
传递给 foo
不会产生任何结果,因为我没有发送指向 a1
的指针。但我不明白的是,为什么如果我在没有指针的情况下将 a2
发送到 bar
,它会更改 a2
.
我想因为_arr2
是一个指针,因为它,bar
改变了它,所以a2
改变了。但是,我们知道每个数组都是指向第一个元素的指针。所以 _arr1
是一个数组,所以它是一个指针,但不会改变!
谁能解释一下为什么会这样?提前很多 tnx!
bar
所做的更改在原始 struct
中可见的原因是因为 struct
副本中的 _arr2
仍指向 _arr1
原来的struct
你已经通过了。本质上,您正在传递一个指针,只是现在它隐藏在按值传递的 struct
中。
这是一种查看正在发生的情况的方法:
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
打印不同的指针。
struct A
里面有一个数组和一个指针。
typedef struct _A {
int _arr1[ARR_SIZE]; // _arr1 is an array
int* _arr2; } A; // _arr2 is a pointer
如果传递指针的副本,副本仍指向同一个地方。
更改副本指向的内容反映在调用函数中。
您可能想了解数组和指针之间的区别。
我建议 c-faq.
的第 6 节
这是我昨天做的测试题。
考虑这段代码:
#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
我看不懂这些印刷品。如果我逐步配置代码,我会看到将 a1
传递给 foo
不会产生任何结果,因为我没有发送指向 a1
的指针。但我不明白的是,为什么如果我在没有指针的情况下将 a2
发送到 bar
,它会更改 a2
.
我想因为_arr2
是一个指针,因为它,bar
改变了它,所以a2
改变了。但是,我们知道每个数组都是指向第一个元素的指针。所以 _arr1
是一个数组,所以它是一个指针,但不会改变!
谁能解释一下为什么会这样?提前很多 tnx!
bar
所做的更改在原始 struct
中可见的原因是因为 struct
副本中的 _arr2
仍指向 _arr1
原来的struct
你已经通过了。本质上,您正在传递一个指针,只是现在它隐藏在按值传递的 struct
中。
这是一种查看正在发生的情况的方法:
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
打印不同的指针。
struct A
里面有一个数组和一个指针。
typedef struct _A {
int _arr1[ARR_SIZE]; // _arr1 is an array
int* _arr2; } A; // _arr2 is a pointer
如果传递指针的副本,副本仍指向同一个地方。
更改副本指向的内容反映在调用函数中。
您可能想了解数组和指针之间的区别。
我建议 c-faq.