使用指针算法将数据从第一个数组复制到第二个数组

Copying data from 1st to 2nd array using Pointer arithemtic

我正在学习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. 

几件事:

  • 无需更新第一个数组的实际内容(这修复了关于您的代码始终将结果存储在 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).

不,你的函数不正确。

*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 个元素的地址),而 returns 介于 0 和 9 之间的值(我们称之为 它 x)。什么时候 *(x) 你将 x 解释为一个指针,它 取消引用(=通过指针访问值)它,但这不是有效的 地址在所有。您最终还将越界访问 a

  4. *arr2 = *arr1; 在这里您也只存储 arr2.

  5. 的第一个元素中的值
  6. 你的函数没有名字。

  7. 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;
}

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

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