当结构数组作为函数参数时,如函数的作用是改变结构中元素的值,是否应该把参数设为指针?

当结构数组作为函数参数时,如函数的作用是改变结构中元素的值,是否应该把参数设为指针?

问题描述:

例如有结构数组a[10],0-9中存储struct part {int code;char name;int number}结构。当仅把参数设为结构数组时,我发现当插入了几件商品的时候,输出是空。其实并未存入数组。我怀疑是因为被调用函数只把实参的副本进行操作,而实参本身没有改变。

如果是传入数组名,数组名退化为指针,就是相当于传入指针了,函数里面对数组的操作就会改变数组里的值,但是因为你的数组里存储的是结构体,而结构体传递是值拷贝传递,而非地址传递,虽然你修改了你传入的数组里面元素(即结构体)的值,但是这个结构体并非函数调用之前的那个结构体,地址不一样。如果想实现你的目的,那么数组里存储结构体指针,函数里改为对结构体指针操作。

你可以把代码贴出来。从你的描述来看,你的函数参数使用的是结构体变量,而非结构体指针,函数中的操作不会影响实参。
例如:
int a[2] = {0,1};
void fun(int value[2])
{
value[0] = 3; //影响不到a[0]
}
应该
void fun(int *pvalue)
{
pvalue[0] = 3;
}

{
char *p="hello world!";
strcpy(str,p);
printf("fun1: %s\n",str);
}

这个会改变原字符数组的值,这里数组名作为参数,其实传递的是数组首元素的地址,形参是指向实参地址的一个变量。
即 fun1(str); 函数调用后, 形参函数内的str所指向的内存地址 和 外面实参str地址是同一个。
strcpy(str,p); 是字符串拷贝函数,赋值后,其实相当于对str所指向内存内容的处理,将p指向的地址的内容赋值给了 str地址的内存中。 又因为 函数内参数str 和外的str是指向的同一个地址,因此会改变原始数组的值。

void fun2(char str[])
{
char *p="hello world!";
str=p;
printf("fun2: %s\n",str);
}
该函数调用后不会改变原来的值。
相当于是调用的时候 函数内 str 地址 和 外面的str地址是指向同一个内存单元。
不同的是 str=p; 这个地方相当于将函数内的 str指针的指向 了p指针的指向的地址。只是地址指向变了,并没有对原始地址的内容作操作,因此不会改变。

另外,函数写的有些问题, main函数里面 字符数组太小额,如果调用函数1 就会出现字符串溢出的情况(helloworld 字符太多了),会出现错误的。还是把数组改大点好。

数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。 数组元素作函数实参 数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,

你可以把参数设为传引用&