今天碰到了一个数组的问题,数组传参前后到底有什么不同,下面我来解答一下:
arr[0]这个表达式表示访问数组 arr 中索引为 0 的元素。在大多数编程语言中,数组的索引是从 0 开始的,所以 arr[0] 是数组的第一个元素。
#include <stdio.h>
int main()
{
int arr[5]={ 10 , 20 , 30 , 40 , 50 };
return 0;
}
但是,当数组arr[5]传参给一个函数时,实际上传递的是数组首元素的地址
#include <stdio.h>
void printFirstElement(int arr[]) //也可以写成(int arr[5]),在这两种情况下,传递给函数的实际上是数组首元素的地址(即指向数组第一个元素的指针)。函数内部的arr参数并不“知道”原始数组的大小是多少,因为数组的大小信息在数组名作为参数传递时会被丢弃。
{
printf("The first element is: %d\n", arr[0]); // arr[0] 访问的是数组的第一个元素
}
int main() {
int arr[5] = {10, 20, 30, 40, 50};
printFirstElement(arr); // 传递数组名,实际上是传递了数组首元素的地址
return 0;
}
在这两种情况 (int arr()) , (int arr(5)) 下,传递给函数的实际上都是数组首元素的地址(即指向数组第一个元素的指针)。函数内部的arr
参数并不“知道”原始数组的大小是多少,因为数组的大小信息在数组名作为参数传递时会被丢弃。
在函数参数中,int arr[]
和int arr[5]
在大多数情况下是等价的,因为编译器都会将它们视为指向int
类型的指针。然而,在某些上下文中(如使用sizeof
操作符时),它们之间的区别可能会变得重要。但是,在函数参数列表中,这个区别通常不会影响函数的行为,因为函数无法直接访问到数组的大小信息。
当数组给函数传参后,传过来的 arr[5] 就不是数组名了,而是变成了一个指针,这时侯 arr[0] 中的0就代表第一个元素的下标,arr[0] 里面存放的就是第一个元素的地址,*arr[0]就是代指主函数中的arr[0],即元素10。
传递前后的不同
传递前
- 数组是一个在内存中连续存储的元素集合。
- 数组名(在没有使用数组下标时)通常被视为指向数组首元素的指针。
- 数组的大小(即元素的数量)在传递数组名时不会自动传递,需要额外指定或通过某种方式计算。
传递后
- 函数接收的是一个指向数组首元素的指针。
- 函数通过这个指针可以访问数组中的元素,但它无法直接知道数组的大小(除非有额外的参数传递了这个信息)。
- 由于只是传递了指针,因此这种方式是非常高效的,因为它避免了复制整个数组的开销。