有没有一种方法可以从方法中更新/返回数组中的元素?

时间:2019-09-21 08:37:23

标签: c arrays

我通常只使用指针,但是在这种情况下,我会陷入困境。因为数组的元素是以“随机”顺序传递的,所以我似乎无法弄清楚如何将w(来自方法更新)设置回in[0](来自方法传递)

int main(){
   unsigned int array[4] = {
      0x10101010, 
      0x10101010,
      0x10101010, 
      0x10101010};

   pass(array);
}

void pass(unsigned int *a){

   update(a[0],a[1],a[4],a[3]);
   printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);  //how would I get the updated value here

   update(a[1],a[0],a[3],a[4]);
   printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);  //and here
}


/*update method could be of any type like int update(...) or whatever else*/
void update(w,x,y,z){ 
   w = z+2;
   x = x+1;
   y = y+2;
   z = w+1;
}

任何的建议或帮助,将不胜感激。

P.S以上代码是我出于示例目的而编写的。

编辑* printf应该使用%u而不是长无符号(%lu)。 由于K&R C(很旧),因此没有用于更新的类型说明符。

2 个答案:

答案 0 :(得分:1)

对于初学者来说,此函数声明不正确,因为没有参数的类型说明符。

void update(w,x,y,z){ 
   w = z+2;
   x = x+1;
   y = y+2;
   z = w+1;
}

如果要更新传递给功能对象的信息,则应通过指针通过引用传递它们。

该函数的外观如下

void update( unsigned int *w, unsigned int *x, unsigned int *y,unsigned int *z )
{ 
   *w = *z+2;
   *x = *x+1;
   *y = *y+2;
   *z = *w+1;
}
  

/ 更新方法可以是任何类型 /

该函数不能像例如

那样声明
void update( void *w, void *x, void *y, void *z );

因为在函数中您需要了解参数的实际类型。

您可以通过以下方式定义函数

void update( void *w, void *x, void *y, void *z, void sum( void *item, void *value ) );

带有一个具有函数类型的附加参数。用作参数的相应函数可以将指针转换为所需的类型并执行加法运算。

这些printf的调用也不正确

printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);
printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);

因为对unsigned int类型的对象使用了错误的转换格式说明符。使用%u代替%lu

请注意,函数passupdate应该在调用之前声明,例如在函数main之前声明。

答案 1 :(得分:0)

您需要将指针传递给update函数,并在该函数中取消引用它们:

    void update(unsigned int* w, unsigned int* x, unsigned int* y, unsigned int* z){ 
       *w = *z+2;
       *x = *x+1;
       *y = *y+2;
       *z = *w+1;
    }

然后使用数组元素的地址调用update

update(&a[0], &a[1], &a[4], &a[3]);