在C中移位数组中的元素 - 基于指针

时间:2012-09-09 09:04:55

标签: c

所以我现在正在尝试学习C,并且我有两个函数:一个用于移动数组中的元素:

void shift(int a[], int n) {
   int i;
   for(i = 0; i != n-1; i++){
      a[i] = a[i+1];
   }
}

和相同函数的一个版本,基于指针的除外:

void pointer_shift(int *a[], int n) {
   int i;
   for (i = 0; i != n - 1; i++) {
      *a[i] = *a[i + 1];
   }
}

我不知道基于指针的版本是否正确,但我想我最重要的问题是我应该如何测试两者都可以正常工作。除了这两个函数的定义外,我还有:

#include <stdio.h>

void shift(int a[], int n);
void pointer_shift(int *a[], int n);

int main(void) {
    printf("Begin execution of testing Problem 1\n");
    int a1[] = {100, 101, 102};
    int i;
    for(i = 0; i<3;i++)
        printf("Before Shift: " "%d\n", a1[i]);
    //shift(a1, 3);
    pointer_shift(&a1, 3);
    for(i = 0; i<3;i++)
        printf("After Shift In Main: " "%d\n", a1[i]);
    return 0;
}
  

转移(a1,3)

工作正常,但是,就我而言,我无法弄清楚如何正确测试pointer_shift。

我得到两个错误;一个是在行

  

pointer_shift(&amp; a1,3)

我从不兼容的指针类型传递参数1。另一个错误是无法解读的,但我希望这个问题足够明显,以至于有人能够帮助我。那么...如何在我的主要部分测试我的两个功能?

谢谢!

4 个答案:

答案 0 :(得分:3)

更改基于指针的函数,如下所示:

void pointer_shift(int *a, int n) {
   int i;
   for (i = 0; i != n - 1; i++) {
      *(a+i) = *(a+i+1);
   }
}

您收到的是指针数组,而您从main传递数组。由于数组衰减为指针,因此调用shift(a1, 3)就足够了。

答案 1 :(得分:2)

更改函数原型以接受int*

void pointer_shift(int *a, int n) 

然后访问像这样的数组元素

*(a+1) = 4;

相同
a[1] = 4;

您仍然可以使用数组变量以相同的方式调用它,因为当作为参数传递给函数时,数组会衰减为指向其第一个元素的指针

答案 2 :(得分:0)

int main(void) {
    printf("Begin execution of testing Problem 1\n");
    int a1[] = {100, 101, 102};
    int *array_of_pointers[3];
    int i;

   array_of_pointers[0]= &a1[0];
   array_of_pointers[1]= &a1[1];
   array_of_pointers[2]= &a1[2];

   for(i = 0; i<3;i++)
       printf("Before Shift: " "%d %p\n ", a1[i], array_of_pointers[i]);

/*
  same as passing a1, the address of the array is
  the same value as the value of the array, just a different type
*/
   pointer_shift(array_of_pointers, 3);
   printf("After Shift, note that array_of_pointers has not shifted:\n");
   for(i = 0; i<3;i++)
       printf("After Shift In Main: " "%d %p\n", a1[i], array_of_pointers[i]);
   return 0;
}

pointer_shift 期望一个指针数组,而不是int数组。 这里的“转移”不在数组中,而是在数值中 数组中的元素指向, 数组元素的值保持不变!

答案 3 :(得分:-1)

您的第一个功能已经基于指针。定义类型为int[]的函数参数时,编译器将其视为与定义指针类型int*相同。因此该函数可以传递指针或数组(将自动转换为指针)。

如果您将函数原型更改为接受int *a而不是int a[],则该函数将完全相同。

你的第二个函数不起作用,因为它需要一个指向int的指针数组,这不是你想要的。