C语言 - 指针算术



函数应使用指针算术(而不是数组订阅)。换句话说,消除循环索引变量以及在函数中的[]运算符的所有使用。

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;
}

相关内容

  • 没有找到相关文章

最新更新