函数应使用指针算术(而不是数组订阅)。换句话说,消除循环索引变量以及在函数中的[]运算符的所有使用。
void set_complement(int *a, int n, int *complement)
{
//pointers and variables declaration
int i;
int *Pa = a;
int *Pc = complement;
for(i = 0; i < n; i++)
{
if( *(Pa + i) == 0)
{
*(Pc + i) = 1;
}
}
}
我的问题是:我是否在循环中使用指针算术?
在一个单词中 - 是的。通过将int
s添加到指针中,您可以有效地移动指针(然后将其删除),或者,换句话说 - 您正在执行指针算术。
是的,您正在使用指针算术。但是您没有消除循环索引变量,因此您可以写出类似的内容:
void set_complement(int *a, int n, int *complement)
{
//pointers declaration
int *Pa = a;
int *Pc = complement;
int *Pend = a + n;
for (; Pa != Pend; ++Pa, ++Pc)
{
if(*Pa == 0)
{
*Pc = 1;
}
}
}
是的,从本质上讲,索引符号是指针算术的速记。默认情况下,该数组中的第一个索引的变量int *a点。从技术上讲,int *a只是通往整数的指针,您只是"碰巧知道"记忆中的其他整数遵循它。因此,他们给了我们方便的符号
a[i] // where i is the number of spaces passed point *a we want to look.
我不确定您在循环中要做什么,但是要访问ITH元素,您将执行以下操作。我的功能只是对数组的称赞a。c不做任何事情。
#include <stdio.h>
void set_compliment(int *a, int *compliment, int n) {
int i;
for (i = 0; i < n; i++) {
// if (a[i] == 0)
if ( *(a + i) == 0) {
// a[i] = 1;
*(a + i) = 1;
// else if (a[i] == 1)
} else if ( *(a+i) == 1) {
// a[i] = 0;
*(a + i) = 0;
}
}
}
//------------------------------------------------------------------------------
void display(int *a, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%i ", a[i]);
}
printf("n");
}
//------------------------------------------------------------------------------
int main() {
int a[] = {1, 1, 1, 1, 0};
int c[] = {0, 0, 0, 0, 1};
// Get length of array
int n = sizeof(a) / sizeof(a[0]);
set_compliment(a, c, n);
display(a, n);
display(c, n);
return 0;
}