一维数组传参的本质

简介: 一维数组传参的本质

一:引入:

如果在函数内部计算一维数组的大小,得到的结果是什么?


`在这里插#include <stdio.h>

void test(int* arr)//参数写成指针形式

{

int sz2 = sizeof(arr) / sizeof(arr[0]);

printf(“sz=%d\n”, sz2);

}

int main()

{

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

int sz1 = sizeof(arr) / sizeof(arr[0]);

printf(“sz1=%d\n”, sz1);

test(arr);

return 0;

}入代码片`


为什么会出现上面结果的差异呢?

二:一维数组传参的本质

本质上数组传参传递的是数组首元素的地址。

函数内部sizeof(arr)计算的是一个地址的大小,而不是数组的大小,正因为函数的参数部分本质是指针,所以在函数内部是无法求出数组的大小。

#include <stdio.h>
void test(int arr[])//形参写成数组形式,本质上还是数组
{
  printf("%d\n", sizeof(arr));
}
//void test(int* arr)//形参写成指针形式
//{
//  printf("%d\n", sizeof(arr));//计算一个指针变量的大小
//}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  test(arr);
  return 0;
}


三:总结

一维数组传参的本质是:数组首元素的地址。

如果想要计算数组元素的个应该在main函数内部计算。

#include <stdio.h>
void test(int* p,int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *(p + i));
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  test(arr,sz);
  return 0;
}


目录
相关文章
|
7月前
|
存储 编译器 C语言
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
141 0
|
6月前
|
C语言
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
|
7月前
|
存储 C语言
C语言向函数传递一维数组的技术详解
C语言向函数传递一维数组的技术详解
236 0
|
存储 机器学习/深度学习 Java
Java数组的定义和使用(一篇带你搞定数组)
Java数组的定义和使用(一篇带你搞定数组)
324 0
|
7月前
|
存储 C语言 索引
指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)
指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)
二维数组传参的本质
二维数组传参的本质
46 0
二维数组传参的本质
|
7月前
|
存储 Java 索引
【Java数组】数组定义 | 初始化赋值 | 数组练习题
【Java数组】数组定义 | 初始化赋值 | 数组练习题
|
存储 C语言 C++
【指针的进阶(1)】指针的类型、数组传参和指针传参
【指针的进阶(1)】指针的类型、数组传参和指针传参
71 0
|
存储 小程序 编译器
数组传参不理解?(数组传参的本质)
数组传参不理解?(数组传参的本质)
111 0
数组作为函数参数传参&数组名到底代表什么意义?
数组作为函数参数传参&数组名到底代表什么意义?