我正在学习C,我遇到了这个问题我无法理解。编写一个函数来计算整数数组a
的元素加上6模数10,并将结果存储在数组b
中。例如,如果5是数组a
的第二个元素,那么数组b
的第二个元素应为(5+6)%10
,即1.该函数具有以下原型{{1 }是数组的长度,n
和a
是整数数组。
我做了:
b
答案 0 :(得分:2)
不,你的功能不正确。
*arr1 = *((a+i)+6)%10);
您只是在数组的第一个元素中写入值。
arr1
指向已有值的a
。你想做的
使用a
中存储的值进行计算,然后将其保存到b
,因此请勿修改
a
。
*((a+i+6)%10)
完全错了。 a+i+6
与&a[i+6]
相同。 %10
适用于值&a[i+6]
(这是i+6
元素的地址),并返回0到9之间的值(让我们调用
它x
)。你*(x)
什么时候将x
解释为指针
dereferences(=通过指针访问值)它,但这不是有效的
完全解决。您最终还将访问a
越界。
*arr2 = *arr1;
此处您还只将值存储在arr2
的第一个元素中。
你的功能没有名字。
int *arr1; arr1=a;
这是不必要的,您可以直接访问a
,不
需要创建指针的副本。
+6 % 10
规则适用于存储在数组中的值,而不是索引。
正确的功能应如下所示:
void compute(int *a, int *b, size_t len)
{
if(a == NULL || b == NULL)
return;
for(size_t i = 0; i < len; ++i)
b[i] = (a[i] + 6) % 10;
}
如果你的作业说你应该用指针算法而不是 使用数组索引:
void compute(int *a, int *b, size_t len)
{
if(a == NULL || b == NULL)
return;
for(size_t i = 0; i < len; ++i)
*(b+i) = (*(a + i) + 6) % 10;
}
答案 1 :(得分:2)
这也是一个强大的地方,可以强化指针是按值传递的,并且函数接收每个指针的副本,它可以自由迭代以影响副本,而不会影响调用者中的指针。所以这样做也是完全有效的:
size_t
(好的工作Pablo使用SELECT deviceid,
neighbors
FROM
`etl.routing_table_nodes`
WHERE
Parent = 'QMI-YSK'
作为长度(或元素数量)参数)