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

问题描述 投票:0回答:3

我正在学习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. 
c arrays function-pointers void-pointers
3个回答
2
投票

几件事:

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


2
投票

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

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


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+6th元素的地址),并返回0到9之间的值(让我们称之为x)。什么时候*(x)你把x解释为指针并且它解引用(=通过指针访问值)它,但这根本不是一个有效的地址。您最终还将访问a
  4. *arr2 = *arr1;在这里你也只将值存储在arr2的第一个元素中。
  5. 你的功能没有名字。
  6. 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.