使用Pointer arithemtic将数据从第1个数组复制到第2个数组

时间:2018-03-03 01:11:47

标签: c arrays function-pointers void-pointers

我正在学习C,我遇到了这个问题我无法理解。编写一个函数来计算整数数组a的元素加上6模数10,并将结果存储在数组b中。例如,如果5是数组a的第二个元素,那么数组b的第二个元素应为(5+6)%10,即1.该函数具有以下原型{{1 }是数组的长度,na是整数数组。

我做了:

b

2 个答案:

答案 0 :(得分:2)

不,你的功能不正确。

*arr1 = *((a+i)+6)%10);
  1. 您只是在数组的第一个元素中写入值。

  2. arr1指向已有值的a。你想做的 使用a中存储的值进行计算,然后将其保存到b,因此请勿修改 a

  3. *((a+i+6)%10)完全错了。 a+i+6&a[i+6]相同。 %10 适用于值&a[i+6](这是i+6元素的地址),并返回0到9之间的值(让我们调用 它x)。你*(x)什么时候将x解释为指针 dereferences(=通过指针访问值)它,但这不是有效的 完全解决。您最终还将访问a越界。

  4. *arr2 = *arr1;此处您还只将值存储在arr2的第一个元素中。

  5. 你的功能没有名字。

  6. int *arr1; arr1=a;这是不必要的,您可以直接访问a,不 需要创建指针的副本。

  7. +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' 作为长度(或元素数量)参数)