我正在学习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.
几件事:
a
的第一个元素中)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
”。你需要为arr1
和arr2
的数组指针添加循环计数器,以便它遍历每个数组的每个元素:*(arr2 + i)
和*(arr1 + i)
。
这也是一个强大的地方,可以强化指针是通过值传递的,并且函数接收每个指针的副本,它可以自由迭代以影响副本,而不会影响调用者中的指针。所以这样做也是完全有效的:
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
的长度(或元素数量)参数)
不,你的功能不正确。
*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;
}