数组传参前后到底有什么不同

  今天碰到了一个数组的问题,数组传参前后到底有什么不同,下面我来解答一下:

  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。

传递前后的不同

传递前
  • 数组是一个在内存中连续存储的元素集合。
  • 数组名(在没有使用数组下标时)通常被视为指向数组首元素的指针。
  • 数组的大小(即元素的数量)在传递数组名时不会自动传递,需要额外指定或通过某种方式计算。
传递后
  • 函数接收的是一个指向数组首元素的指针。
  • 函数通过这个指针可以访问数组中的元素,但它无法直接知道数组的大小(除非有额外的参数传递了这个信息)。
  • 由于只是传递了指针,因此这种方式是非常高效的,因为它避免了复制整个数组的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值