关于数组长度获取的问题求助
#include <stdio.h>void reverseArray(int a[])
{
int arrLength = sizeof(a)/sizeof(int); //这里一直arrLength是2,百思不得其解。。。。
int tmp = 0;
for (int i = 0; i < arrLength/2; i++)
{
printf("%d - %d\n", a, a);
tmp = a;
a = a;
a = tmp;
}
for (int i = 0; i < arrLength; i++)
{
printf("%d\n", a);
}
}
int main()
{
int a = {1,2,3,4,5};
reverseArray(a);
return 0;
}
上面reverseArray中数组长度获取始终得不到预期值,麻烦帮忙看下小弟哪里出错了 = - 。 听没听过数组自动降为指针这句话 本帖最后由 jackz007 于 2022-8-20 09:49 编辑
a 是常数指针,对于 64 位的程序而言,每个指针占用 8 个字节,而每个 int 则占用 4 个字节,所以,计算结果是 2。
你不可以用这种方式来获取数组的元素个数,必须为函数增加一个整型参数 5,用以显式告诉函数,数组 a 含有 5 个元素。当然,也可以为 a 多定义出一个元素,专门用于传递元素数量,例如,定义 a 的容量为 6,让 a = 5,为元素个数,a ~ a 为 5 个数组元素,这样,你也可以不用为函数新增变量参数。 数组本身是指针,如果使用vector就正确了
建议在参数里加一个len或n表示数组的长度 数组传入函数时其实传入的是指针,因为直接传入数组的成本太大了
其实你完全可以改成void reverseArray(int *a),因为a就是指针 {:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:} #include <stdio.h>
void reverseArray(int *a, int n)
{
int tmp = 0;
for (int i = 0; i < arrLength/2; i++)
{
printf("%d - %d\n", a, a);
tmp = a;
a = a;
a = tmp;
}
for (int i = 0; i < arrLength; i++)
{
printf("%d\n", a);
}
}
int main()
{
int a = {1,2,3,4,5};
reverseArray(a,sizeof(a)/sizeof(int) );
return 0;
}
我改了一下,上来这样应该没问题,要不你编译下。
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数组中的元素的个数 我猜到了你的系统是64位,因为函数传入数组并非整个数组传过去,而是传入数组首地址(指向数组第一个元素的地址),所以sizeof(a)是8或4 当指针作为参数传入函数,sizeof()无法计算大小,如果需要用到指针长度,请将指针长度作为形参传入 本帖最后由 两手空空儿 于 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楼那样再传一个参数就能很好的解决这个问题了 jackz007 发表于 2022-8-20 07:57
a 是常数指针,对于 64 位的程序而言,每个指针占用 8 个字节,而每个 int 则占用 4 个字节,所以 ...
同意,反正数组名是一个指针,不同编译系统长度不定,就像楼上说的 本帖最后由 ExiaGN001 于 2022-9-14 20:54 编辑
传入reverseArray的a 是
int* a
而非
int a[]
假定32位系统,则
sizeof(int *)=4
sizeof(int)=2
4/2确实是2
解决:
#include <stdio.h>
void reverseArray(int *a,int arrLength)
{
int tmp = 0;
for (int i = 0; i < arrLength/2; i++)
{
printf("%d - %d\n", a, a);
tmp = a;
a = a;
a = tmp;
}
for (int i = 0; i < arrLength; i++)
{
printf("%d\n", a);
}
}
int main()
{
int a = {1,2,3,4,5};
reverseArray(a,sizeof(a)/sizeof(int) );
return 0;
}
页:
[1]