C语言 - 指针算术

时间:2017-10-01 22:46:38

标签: c pointers pointer-arithmetic

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

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中使用指针算法?

3 个答案:

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