指针和数组在C中有什么不同吗?

时间:2009-06-28 04:39:33

标签: c arrays pointers

我正在编写一个小型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;
}

我使用指针吗?

5 个答案:

答案 0 :(得分:14)

您的代码段是正确的。但是,C中的指针和数组确实不同。简单地说“指向类型T的指针”与“类型T的数组”不同。

请查看C Faq讨论Pointers&amp;数组,以便更好地理解这一点。

答案 1 :(得分:2)

已经给出了C-FAQ:Arrays和Pointers的链接,但在C for Smarties: Arrays and Pointers中也有详尽的解释。您可能希望首先阅读“分析表达式”页面。

关于你的例子的一些事情应该纠正:

  1. 使用int代替正确的size_t来存储对象大小。
  2. 未检查malloc()
  3. 的返回值

    解决第二个问题的一种方法是让调用者决定输出的存储位置(调用者可能不需要或者需要新分配的数组):

    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);

<击>