我通常只使用指针,但是在这种情况下,我会陷入困境。因为数组的元素是以“随机”顺序传递的,所以我似乎无法弄清楚如何将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(很旧),因此没有用于更新的类型说明符。
答案 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
。
请注意,函数pass
和update
应该在调用之前声明,例如在函数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]);