使用指针算法将数据从第一个数组复制到第二个数组
Copying data from 1st to 2nd array using Pointer arithemtic
我正在学习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
的第一个元素中的错误)
使用一些 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
”。您需要将循环计数器添加到 arr1
和 arr2
的数组指针,以便它遍历每个数组的每个元素:*(arr2 + i)
和 *(arr1 + i)
.
不,你的函数不正确。
*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
个元素的地址),而 returns 介于 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;
}
这也是强调指针按值传递并且函数接收每个指针的副本的好地方,它可以自由迭代以影响副本而不影响调用者中的指针。所以这样做也是完全有效的:
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
作为长度(或元素数量)参数)
我正在学习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
的第一个元素中的错误) 使用一些 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
”。您需要将循环计数器添加到 arr1
和 arr2
的数组指针,以便它遍历每个数组的每个元素:*(arr2 + i)
和 *(arr1 + i)
.
不,你的函数不正确。
*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
个元素的地址),而 returns 介于 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;
}
这也是强调指针按值传递并且函数接收每个指针的副本的好地方,它可以自由迭代以影响副本而不影响调用者中的指针。所以这样做也是完全有效的:
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
作为长度(或元素数量)参数)