所以我现在正在尝试学习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。另一个错误是无法解读的,但我希望这个问题足够明显,以至于有人能够帮助我。那么...如何在我的主要部分测试我的两个功能?
谢谢!
答案 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的指针数组,这不是你想要的。