函数应该使用指针算术(而不是数组下标)。换句话说,消除循环索引变量以及在函数中使用[]运算符。
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;
}
}
}
我的问题是:我是否在for-loop中使用指针算法?
答案 0 :(得分:1)
总之 - 是的。通过向指针添加int
s,您可以有效地移动指针(然后解除引用它),换句话说,就是执行指针运算。
答案 1 :(得分:1)
是的,您正在使用指针算法。但是你没有消除循环索引变量,所以你可以编写类似的东西:
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;
}
}
}
答案 2 :(得分:0)
是的,基本上,索引表示法是指针算术的简写。默认情况下,变量int * a指向该数组中的第一个索引。从技术上讲,int * a只是一个指向整数的指针,而你只是偶然知道&#39;记忆中的其他整数遵循它。因此他们给了我们一个方便的符号
a[i] // where i is the number of spaces passed point *a we want to look.
我不确定你在循环中想要做什么,但是要访问第i个元素,你会做以下事情。我的函数只是对数组的赞美。没有做任何事情。
#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;
}