我正在学习C,我遇到了这个问题我无法理解 . 编写一个函数来计算整数数组的元素 a
加上6模数10并将结果存储在数组 b
中 . 例如,如果5是数组 a
的第二个元素,那么数组 b
的第二个元素应为 (5+6)%10
,即1.该函数具有以下原型, n
是数组的长度, a
和 b
是整数数组 .
我做了:
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 回答
不,你的功能不正确 .
您只是在数组的第一个元素中写入值 .
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
规则适用于存储在数组中的值,而不是索引 .正确的函数应该如下所示:
如果你的任务说你应该使用指针算法而不是使用数组索引:
几件事:
无需更新第一个数组的实际内容(修复了有关代码的错误,并始终将结果存储在
a
的第一个元素中)使用一些parens确保您获得正确的操作顺序 .
想想你的头衔“
...using Pointer arithemtic
” . 您需要将循环计数器添加到arr1
和arr2
的数组指针,以便它逐步遍历每个数组的每个元素:*(arr2 + i)
和*(arr1 + i)
.这也是一个强大的地方,可以强化指针按值传递,并且函数接收每个指针的副本,它可以自由迭代以影响副本,而不会影响调用者中的指针 . 所以这样做也是完全有效的:
(好的工作Pablo使用
size_t
的长度(或元素数量)参数)