有几个问题想问下高手们:
1.在C语言中怎么求数组元素的个数?有没有现成的函数,或者实现的算法。
2.小弟今天写了一个代码很诡异,先来看代码
#include<stdio.h>
#include<stdlib.h>//union两个数组
int length(int a[])
{
int count;
count=sizeof(a)/sizeof(int);
return count;
}void main()
{
int a[]={1,2,3,4,5};
int b[]={4,5,6};
int count;
count=strlen(a);
//count=sizeof(a)/sizeof(int);
//unionarray(a,b);
printf("%d\n",count);
system("Pause");
}
在这种情况下,count的值是1,但是如果将sizeof(a)/sizeof(int)写在主函数中就能得出count的值是正确的5,这是为什么?两个问题求指教。。
1.在C语言中怎么求数组元素的个数?有没有现成的函数,或者实现的算法。
2.小弟今天写了一个代码很诡异,先来看代码
#include<stdio.h>
#include<stdlib.h>//union两个数组
int length(int a[])
{
int count;
count=sizeof(a)/sizeof(int);
return count;
}void main()
{
int a[]={1,2,3,4,5};
int b[]={4,5,6};
int count;
count=strlen(a);
//count=sizeof(a)/sizeof(int);
//unionarray(a,b);
printf("%d\n",count);
system("Pause");
}
在这种情况下,count的值是1,但是如果将sizeof(a)/sizeof(int)写在主函数中就能得出count的值是正确的5,这是为什么?两个问题求指教。。
在函数传参时,int a[]和int* a完全等同,int a[][5]和int (*a)[5]完全等同
不是求整形的!
你试试 int length(char* a[]) 的sizeof(a)是1还是4
{
int count;
count=sizeof(a)/sizeof(int);
return count;
}
形参不是不能这么返回的吗
是4,为什么会出现这种情况呢,怎么才能写出求数组的个数的函数呢。。
int a[]在main 内部定义,函数main的大括号内 int a[] ={...} 的下面,才可以知道数组的大小。
其他地方,数组的大小是不可见的。
所以不能得到数组的大小。另外函数参数里的数组,其实是指针,不能获得真实大小,获得的是指针的大小。
可以用宏定义来获取数组的大小。外部数组的引用声明,也是一个指针,不能够获取数组的大小,试图获取会出错,编译不过去。
#define arrsize(a) (sizeof(a) /sizeof(a[0]))
extern int a[];
// int t= arrsize(a); //出错,编译不过去
int func(int a[])
{
return sizeof(a) ;
//返回指针长度,这个指针是在栈中的临时变量,即形参,
//只是复制了实参指针的值,不包含数组大小,相关的任何信息,
//虽然和实参的指针长度一样。
}
int a[]={...};
int b[sizeof(a)/sizeof(a[0])] ={} //这个地方没有问题。
int c [arrsize(a)] ; // 这个地方没有问题。
int main()
{
int t[]={1,2,3,4};
func(a); //指针长度而已。
arrsize(a);//数组元素个数.
arrsize(t);//数组t的元素个数4.
{
int y[]={1,2,3};
}
//arrsize(y);// 出错,编译不过去
return 0;
}
有点问题
应该是
int b[sizeof(a)/sizeof(a[0])] ={1,2,3} //这个地方没有问题,元素不比a多就可以了。
byte bArray[1024] = {0};
int n = _countof(bArray);
{
int count;
count=sizeof(a)/sizeof(int); // 编译时已经计算为常量
return count;
}int a[] 可看做指针
sizeof(a) 32位下 指针长度4字节 = 结果 4
sizeof(int) 32位下 int占4字节 = 结果 4
4 / 4 = 常量 1
所以上面调试会为结果会为1.
数组大小暂时只知道用一些STL中现成的函数,如果是自己定义的函数可考虑以特殊标志位结尾进行标记
就是数组/单个元素大小,可得个数
sizeof加数组得到数组的总大小,不是元素个数 。
就是数组/单个元素大小,可得个数
sizeof加数组得到数组的总大小,不是元素个数 。这个问题是这个样子的,
一般来说,我们想知道数组的大小,实际指的是数组有多少元素。
而数组的真正大小(不是很严格),是指数组占用的内存的大小。
二者是有联系的,知道一个就可以知道另一个,
1)sizeof(a),数组内存占用的大小。
2)arrsize(a),数组元素个数。 这两个都可以,认为是数组的大小。
这样数组大小就有两层意思了。但是知道任意一个,另外一个就很容易知道了。
所以,举例的时候,难免会混淆这两层意思。
抱歉!!
用过java? array.length很好用是吧?c开一个数组,如果用指针操作,可以获取超出地址范围的值而不出错,根本没有结束标识
count=length(a)里的a是指针,就是某个数,count当然为1;
count=sizeof(a)/sizeof(int)里,是a数组空间/整形空间,结果是a数组空间里有多少个整形空间,即整数的个数,count也就=5了。
C的数组类型,是N种类型;
当数组实际定义时,程序员会主动或者被动的选择一种类型。
int a[10] ; 主动从 int[1]~int[MAX_INT] 一共MAX_INT种类型中选择了
int[10]这一具体的数组类型。
int a[]={1,2,3,4,5};被动 从 int[1]~int[MAX_INT] 一共MAX_INT种类型中选择了
int[5] 这一具体的数组类型。
作为数组参数只能传递指针和并保留类型信息,其中类型信息是直接定义的,指针是传递的
说以函数里只能得到形参指针的大小。
要想调用后获取数组大小,C只能只能用宏定义;
c++也许另有办法,不过看到VC的_coutof 实现感到,有点不寒而栗。
实在不如C的简单方便,而且C,C++兼容。