有几个问题想问下高手们:
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.   

    数组名只有在定义时可以整体操作,大多数时候数组名都被隐式转化为指向数组首元素的指针
    在函数传参时,int a[]和int* a完全等同,int a[][5]和int (*a)[5]完全等同
      

  2.   

    count=strlen(a);
    不是求整形的!
      

  3.   

    额。。打错了,那如果count=length(a)呢。。
      

  4.   

    在主函数中:count=length(a)的时候,输出结果是1呢。。
      

  5.   

    在length中的所有参数指针 用sizeof 都会得到4int length(int a[])
    你试试 int length(char* a[]) 的sizeof(a)是1还是4
      

  6.   

    int length(int a[])
    {
    int count;
    count=sizeof(a)/sizeof(int);
    return count;
    }
    形参不是不能这么返回的吗
      

  7.   

    在主函数中:count=length(a)的时候,输出结果是1呢。。
    是4,为什么会出现这种情况呢,怎么才能写出求数组的个数的函数呢。。
      

  8.   

    只有数组定义可见处,才可以得到数组大小。
    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;
    }
     
      

  9.   

    int b[sizeof(a)/sizeof(a[0])] ={} //这个地方没有问题。
    有点问题
    应该是
    int b[sizeof(a)/sizeof(a[0])] ={1,2,3} //这个地方没有问题,元素不比a多就可以了。
      

  10.   


    byte bArray[1024] = {0};
    int n = _countof(bArray);
      

  11.   

    _countof: VC6 好像不可用,VC9 可以用
      

  12.   

    求数组元素个数用ARRAYSIZE(数组名),没错吧?
      

  13.   

    这个sizeof是编译时计算int length(int a[])
     {
     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
      

  14.   

    指针指向地址单元,与int型占用内存是一样的。32位与64位OS区别就在于最小地址单元,一个4B,一个8B。
    所以上面调试会为结果会为1.
    数组大小暂时只知道用一些STL中现成的函数,如果是自己定义的函数可考虑以特殊标志位结尾进行标记
      

  15.   

    数组名作为参数传递,会退化为指针。也就是不含有元素个数的信息。楼主可以看看那个数组名不是指针的帖子。http://bbs.csdn.net/topics/390470131
      

  16.   

    #define arrsize(a)  (sizeof(a) /sizeof(a[0]))
    就是数组/单个元素大小,可得个数
    sizeof加数组得到数组的总大小,不是元素个数 。
      

  17.   

    #define arrsize(a)  (sizeof(a) /sizeof(a[0]))
    就是数组/单个元素大小,可得个数
    sizeof加数组得到数组的总大小,不是元素个数 。这个问题是这个样子的,
    一般来说,我们想知道数组的大小,实际指的是数组有多少元素。
    而数组的真正大小(不是很严格),是指数组占用的内存的大小。
    二者是有联系的,知道一个就可以知道另一个,
    1)sizeof(a),数组内存占用的大小。
    2)arrsize(a),数组元素个数。  这两个都可以,认为是数组的大小。
    这样数组大小就有两层意思了。但是知道任意一个,另外一个就很容易知道了。
    所以,举例的时候,难免会混淆这两层意思。
    抱歉!!
      

  18.   


    用过java?  array.length很好用是吧?c开一个数组,如果用指针操作,可以获取超出地址范围的值而不出错,根本没有结束标识
      

  19.   

    简单来说,
    count=length(a)里的a是指针,就是某个数,count当然为1;
    count=sizeof(a)/sizeof(int)里,是a数组空间/整形空间,结果是a数组空间里有多少个整形空间,即整数的个数,count也就=5了。
      

  20.   

    C,C++的数据以及函数类型等是和位置相关的,数组定义不可见的地方,不能获得数组大小函数参数中的数组其实是指针,不是数组;
    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++兼容。