1

所以我现在正在尝试学习 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。

我得到两个错误;一个是在线的

指针移位(&a1, 3)

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

谢谢!

4

4 回答 4

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)就足够了。

于 2012-09-09T09:10:05.423 回答
2

更改函数原型以接受int*

void pointer_shift(int *a, int n) 

然后像这样访问数组元素

*(a+1) = 4;

这与

a[1] = 4;

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

于 2012-09-09T09:12:49.003 回答
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 数组。这里的“移位”不在数组中,而是在数组中元素指向的值中,数组元素的值保持不变!

于 2012-09-09T09:27:58.087 回答
-1

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

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

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

于 2012-09-09T09:20:10.880 回答