编程C开发者

在C语言中,指针和数组有什么区别?如何正确地将数组传递给函数?

用 Hintsage AI 助手通过面试

答案。

在C语言中,指针和数组相关,但并不相同:

  • 数组 — 一组内存中同类型元素的集合,其大小是确定的。
  • 指针 — 一个存储内存地址的变量,数组或单个对象可以指向这个地址。

在将数组传递给函数时,实际上传递的是指向数组第一个元素的指针(因此在函数内部使用sizeof不返回整个数组的大小,而仅返回指针的大小)。

传递的语法:

void foo(int arr[], int size) { // arr 实际上是 int* for (int i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int data[5] = {1,2,3,4,5}; foo(data, 5); }

误导性问题。

问题: 如果arr是类型为int arr[]的参数,那么在函数内部,表达式sizeof(arr)会返回什么?

答案: 返回指针的大小(sizeof(int*)),而不是整个数组的大小。因为传递给函数的是指向第一个元素的指针,关于长度的信息丢失了。

代码示例:

void printSize(int arr[]) { printf("%zu ", sizeof(arr)); // sizeof(int*) 通常是4或8 }

历史

在一个商业项目中,为了计算数组的平均值,编写的代码在函数内部使用sizeof(arr) / sizeof(arr[0])来计算元素数量,结果总是返回1或2,而不是实际的元素数量。这导致程序在处理数据时不正确,平均值计算错误。


历史

在一个项目中,动态分配的数组在没有单独存储长度(size)的情况下被传递给函数。结果函数不知道分配了多少个元素,导致越界、内存泄漏或损坏。


历史

错误地将固定大小的数组用作指针,在一些编译器中允许通过memcpy直接分配整个数组而不是它的元素。这导致出现不明显的错误,使得数据结构的部分丢失或栈溢出。