鱼C论坛

 找回密码
 立即注册
查看: 2327|回复: 11

关于数组长度获取的问题求助

[复制链接]
发表于 2022-8-20 01:44:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>

  2. void reverseArray(int a[])
  3. {
  4.         int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
  5.         int tmp = 0;

  6.                 for (int i = 0; i < arrLength/2; i++)
  7.                 {
  8.                         printf("%d - %d\n", a[i], a[arrLength - (i + 1)]);
  9.                         tmp = a[i];
  10.                         a[i] = a[arrLength - (i+1)];
  11.                         a[arrLength - (i + 1)] = tmp;
  12.                 }

  13.                 for (int i = 0; i < arrLength; i++)
  14.                 {
  15.                         printf("%d\n", a[i]);
  16.                 }
  17. }


  18. int main()
  19. {

  20.         int a[5] = {1,2,3,4,5};
  21.         reverseArray(a);

  22.         return 0;

  23. }
复制代码


上面reverseArray中数组长度获取始终得不到预期值,麻烦帮忙看下小弟哪里出错了 = - 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-20 05:25:39 From FishC Mobile | 显示全部楼层
听没听过数组自动降为指针这句话
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 07:57:17 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2022-8-20 09:49 编辑

         a 是常数指针,对于 64 位的程序而言,每个指针占用 8 个字节,而每个 int 则占用 4 个字节,所以,计算结果是 2。
         你不可以用这种方式来获取数组的元素个数,必须为函数增加一个整型参数 5,用以显式告诉函数,数组 a 含有 5 个元素。当然,也可以为 a 多定义出一个元素,专门用于传递元素数量,例如,定义 a 的容量为 6,让 a[0] = 5,为元素个数,a[1] ~ a[5] 为 5 个数组元素,这样,你也可以不用为函数新增变量参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 08:25:46 | 显示全部楼层
数组本身是指针,如果使用vector就正确了
建议在参数里加一个len或n表示数组的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 09:41:01 | 显示全部楼层
数组传入函数时其实传入的是指针,因为直接传入数组的成本太大了
其实你完全可以改成void reverseArray(int *a),因为a就是指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 10:20:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-20 16:30:43 | 显示全部楼层
  1. #include <stdio.h>

  2. void reverseArray(int *a, int n)
  3. {
  4.         int tmp = 0;

  5.                 for (int i = 0; i < arrLength/2; i++)
  6.                 {
  7.                         printf("%d - %d\n", a[i], a[arrLength - (i + 1)]);
  8.                         tmp = a[i];
  9.                         a[i] = a[arrLength - (i+1)];
  10.                         a[arrLength - (i + 1)] = tmp;
  11.                 }

  12.                 for (int i = 0; i < arrLength; i++)
  13.                 {
  14.                         printf("%d\n", a[i]);
  15.                 }
  16. }


  17. int main()
  18. {

  19.         int a[5] = {1,2,3,4,5};

  20.         reverseArray(a,sizeof(a)/sizeof(int) );

  21.         return 0;

  22. }
复制代码

我改了一下,上来这样应该没问题,要不你编译下。
int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
我觉得arrLength的值在函数void reverseArray(int a[])里面应该是1,我运行了下也是1,不是你说的2
记着一维数组是用int *a来接收的就可以了,函数形参是void reverseArray(int *a,int n)  //int *a,接受数组的首元素的地址, n数组中的元素的个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-12 17:37:34 | 显示全部楼层
我猜到了你的系统是64位,因为函数传入数组并非整个数组传过去,而是传入数组首地址(指向数组第一个元素的地址),所以sizeof(a)是8或4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 09:09:34 | 显示全部楼层
当指针作为参数传入函数,sizeof()无法计算大小,如果需要用到指针长度,请将指针长度作为形参传入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 11:11:07 | 显示全部楼层
本帖最后由 两手空空儿 于 2022-9-14 11:13 编辑

void reverseArray(int a[])
{
        int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
子函数中a只是一个int型指针,就只是一个int指针,这里的[]不起数组的作用,是把a变成了一个指针,int a[] 等同于 int *a,电脑只知道从这里开始,不知道到哪里结束,sizeof(a)只能得到一个指针的长度,
a这个指针就看程序内怎么用, a[]这样用就是一个一维数组,a[][]这样用就是一个二维数组
像7楼那样再传一个参数就能很好的解决这个问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 11:43:48 | 显示全部楼层
jackz007 发表于 2022-8-20 07:57
a 是常数指针,对于 64 位的程序而言,每个指针占用 8 个字节,而每个 int 则占用 4 个字节,所以 ...

同意,反正数组名是一个指针,不同编译系统长度不定,就像楼上说的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 20:53:29 | 显示全部楼层
本帖最后由 ExiaGN001 于 2022-9-14 20:54 编辑

传入reverseArray的a 是
int* a
而非
int a[]
假定32位系统,则
sizeof(int *)=4
sizeof(int)=2
4/2确实是2

解决:
  1. #include <stdio.h>

  2. void reverseArray(int *a,int arrLength)
  3. {
  4.         int tmp = 0;
  5.                 for (int i = 0; i < arrLength/2; i++)
  6.                 {
  7.                         printf("%d - %d\n", a[i], a[arrLength - (i + 1)]);
  8.                         tmp = a[i];
  9.                         a[i] = a[arrLength - (i+1)];
  10.                         a[arrLength - (i + 1)] = tmp;
  11.                 }
  12.                 for (int i = 0; i < arrLength; i++)
  13.                 {
  14.                         printf("%d\n", a[i]);
  15.                 }
  16. }
  17. int main()
  18. {
  19.         int a[5] = {1,2,3,4,5};
  20.         reverseArray(a,sizeof(a)/sizeof(int) );
  21.         return 0;

  22. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-7 03:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表