我正在编写一个小型C程序来进行一些数字运算,它需要在函数之间传递数组。函数应该接受并返回指针,对吗?
例如,这(我知道它可能不是最有效的):
int* reverse(int* l, int len) {
int* reversed = malloc(sizeof(*reversed)*len);
int i, j;
for (i = 0, j = len-1; i < len; i++, j--) {
reversed[j] = l[i];
}
return reversed;
}
我使用指针吗?
答案 0 :(得分:14)
您的代码段是正确的。但是,C中的指针和数组确实不同。简单地说“指向类型T的指针”与“类型T的数组”不同。
请查看C Faq讨论Pointers&amp;数组,以便更好地理解这一点。
答案 1 :(得分:2)
已经给出了C-FAQ:Arrays和Pointers的链接,但在C for Smarties: Arrays and Pointers中也有详尽的解释。您可能希望首先阅读“分析表达式”页面。
关于你的例子的一些事情应该纠正:
int
代替正确的size_t
来存储对象大小。malloc()
。解决第二个问题的一种方法是让调用者决定输出的存储位置(调用者可能不需要或者需要新分配的数组):
int *reverse(int *out, int *l, size_t len) {
size_t i, j;
for (i = 0, j = len - 1; i < len; ++i, --j) {
out[j] = l[i];
}
return out;
}
答案 2 :(得分:1)
从低级别的角度来看,数组是一个连续的内存块,由该块的开头地址和偏移量访问,因此从该抽象级别开始,它是一个指针。但是,从C语言的角度来看,数组类型与指针类型不同。基本上可以将数组分配给指针值,但它不是同一类型。
出于功能的目的,你做得很好。
答案 3 :(得分:1)
在迂腐理论中,数组和指针是不同的东西,因为数组指定了一个内存区域,因此数组的大小是其类型的一部分。所以有人说当在该上下文中使用时,数组名称会衰减到指针。 There's a detailed explanation in the C-FAQ
实际上它们是相同的,因为正式a[i]
与*(a+i)
是相同的,因此编译器后端以完全相同的方式处理数组名称和指针。值得担心的唯一区别是
void foo()
{
int a[5]; // allocates five words of space on the stack
int *b; // allocates *one* word of space on the stack (to hold the pointer)
}
您的代码段很好。小心释放你的函数malloc()
的内存,无论谁调用它。
答案 4 :(得分:0)
C中的数组由指向第一个元素的指针表示和操作,例如
int arr[50];
int * ptr1 = arr;
int * ptr2 = &arr[0];
在这个例子中,ptr1 == ptr2因为数组的第一个元素的地址和数组的基指针是相同的。
所以你的基本例子是正确的,虽然我怀疑malloc应该是:
int* reversed = malloc(sizeof(int)*len);
击> <击> 撞击>