首页 文章

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

提问于
浏览
0

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

我做了:

void arithmetic (int *a, int n, int *b)
       {
         int *arr1; arr1=a; int *arr2; arr2=b; 

         int i;

         for(i = 0; i < n; i++) {
           *arr1 = *(((a + i) + 6) % 10);
           *arr2 = *arr1;
         }

         }//don't know if the function is correct.

3 回答

  • 3

    不,你的功能不正确 .

    *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 th元素的地址),并返回0到9之间的值(让我们称之为 x ) . 当 *(x) 你正在将 x 解释为指针并且它解引用(=通过指针访问该值)它,但这根本不是有效地址 . 您最终还将访问 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;
    }
    
  • 3

    几件事:

    • 无需更新第一个数组的实际内容(修复了有关代码的错误,并始终将结果存储在 a 的第一个元素中)

    • 使用一些parens确保您获得正确的操作顺序 .

    void newArr(int *a, int n, int *b) {
        int *arr1; arr1 = a; int *arr2; arr2 = b;
    
        for (int i = 0; i < n; i++) {
            *(arr2 + i) = (*(arr1 + i) + 6) % 10;
        }
    }
    

    想想你的头衔“ ...using Pointer arithemtic ” . 您需要将循环计数器添加到 arr1arr2 的数组指针,以便它逐步遍历每个数组的每个元素: *(arr2 + i)*(arr1 + i) .

  • 3

    这也是一个强大的地方,可以强化指针按值传递,并且函数接收每个指针的副本,它可以自由迭代以影响副本,而不会影响调用者中的指针 . 所以这样做也是完全有效的:

    void arithmetic (int *a, int *b, size_t n)
    {
        if (!a || !b)
            return;
    
        for(size_t i = 0; i < n; i++, a++, b++)
            *b = (*a + 6) % 10;
    }
    

    (好的工作Pablo使用 size_t 的长度(或元素数量)参数)

相关问题