C 如何查找数组中的元素数?

C 如何查找数组中的元素数?,c,arrays,sizeof,C,Arrays,Sizeof,我有一个int数组,我需要找到其中的元素数。我知道它与sizeof有关,但我不知道如何准确地使用它 int a[20]; int length; length = sizeof(a) / sizeof(int); 您可以使用另一种方法使代码不被硬编码为int 假设您有一个数组array int numArrElements = sizeof(myArray) / sizeof(int); 你只需要: int len = sizeof(array) / sizeof(array[0]); 如

我有一个
int
数组,我需要找到其中的元素数。我知道它与
sizeof
有关,但我不知道如何准确地使用它

int a[20];
int length;
length = sizeof(a) / sizeof(int);
您可以使用另一种方法使代码不被硬编码为
int

假设您有一个数组
array

int numArrElements = sizeof(myArray) / sizeof(int);
你只需要:

int len = sizeof(array) / sizeof(array[0]);

如果数组在作用域中,则可以使用
sizeof
确定其大小(以字节为单位),并使用除法计算元素数:

#define NUM_OF_ELEMS 10
int arr[NUM_OF_ELEMS];
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]);
如果将数组作为函数参数接收或在堆中分配数组,则无法使用
sizeof
确定其大小。您必须以某种方式存储/传递尺寸信息才能使用它:

void DoSomethingWithArray(int* arr, int NumOfElems)
{
    for(int i = 0; i < NumOfElems; ++i) {
        arr[i] = /*...*/
    }
}
void DoSomethingWithArray(int*arr,int NumOfElems)
{
对于(int i=0;i
我个人认为sizeof(a)/sizeof(*a)看起来更干净

我还更喜欢将其定义为宏:

#define NUM(a) (sizeof(a) / sizeof(*a))
然后您可以在for循环中使用它,因此:

for (i = 0; i < NUM(a); i++)
for(i=0;i
如上文所述,我使用以下代码来计算二维数组中的元素数:

#include <stdio.h>
#include <string.h>

void main(void)
{
    char strs[3][20] =
    {
        {"January"},
        {"February"},
        {""}
    };

    int arraysize = sizeof(strs)/sizeof(strs[0]);

    for (int i = 0; i < arraysize; i++)
    {
        printf("Month %d is: %s\n", i, strs[i]);
    }

}
#包括
#包括
真空总管(真空)
{
字符strs[3][20]=
{
{“一月”},
{“二月”},
{""}
};
int arraysize=sizeof(strs)/sizeof(strs[0]);
for(int i=0;i
它工作得很好。据我所知,在C数组中不能混用不同的数据类型,而且所有数组元素的大小都应该相同(如果我是对的话),因此您可以通过以下小技巧利用这一点:

  • 使用sizeof()函数从整个2d数组中计算字节数(在本例中为3*20=60字节)
  • 使用sizeof()函数从第一个数组元素strs[0]计算字节数(在本例中为20字节)
  • 将整个大小除以一个元素的大小,得到的元素数是多少

  • 在C语言中,这个被剪断的数组应该可以移植到2d数组中,但是在其他编程语言中它无法工作,因为可以在数组中使用不同大小的不同数据类型(如JAVA)。

    除非数组是字符数组,否则无法找到数组中的元素数。考虑下面的例子:

    int main()
    {
        int arr[100]={1,2,3,4,5};
        int size = sizeof(arr)/sizeof(arr[0]);
        printf("%d", size);
        return 1;
    }
    
    即使元素数为5,上述值也为我们提供了值100。 如果是字符数组,则可以在数组末尾线性搜索空字符串,并在遍历时增加计数器

    #include<stdio.h>
    int main()
    {
        int arr[]={10,20,30,40,50,60};
        int *p;
        int count=0;
    
        for(p=arr;p<&arr+1;p++)
            count++;
    
        printf("The no of elements in array=%d",count);
    
        return 0;
    }
    
    现在让我们检查条件并计算值


    • 第一次
      p=1000
      p实际上,在动态整数数组中没有正确的方法来计算元素。但是,sizeof命令在Linux中可以正常工作,但在Windows中不能正常工作。从程序员的角度来看,不建议使用sizeof来获取动态数组中的元素数。制作数组时,我们应该跟踪元素的数量。

      我发现了一种简单的方法,可以像这样在循环中执行数组的长度

       int array[] = {10, 20, 30, 40};
       int i;
       for (i = 0; i < array[i]; i++) {
          printf("%d\n", array[i]);
       }
      
      int数组[]={10,20,30,40};
      int i;
      对于(i=0;i
      如果我们不知道数组中的元素数以及用户在运行时何时给出输入。然后我们可以将代码编写为

      C代码:

      while(scanf(“%d”),&array[count])==1{
      计数++;
      }
      
      C++代码:

      while(cin>>a[count]){
      计数++;
      }
      

      现在计数将有输入数组元素的计数。

      问题很简单:给定C++数组(例如<代码> x<代码> >如<代码> int x(10)< /> >,您将如何获得元素的数量?

      一个明显的解决方案是以下宏(定义1)

      #define countof( array ) ( sizeof( array )/sizeof( array[0] ) )
      
      template <typename T, size_t N>
      size_t countof( T array[N] )
      {
         return N;
      }
      
      template <typename T, size_t N>
      size_t countof( T (&array)[N] )
      {
          return N;
      }
      
      我不能说这是不对的,因为当你给它一个数组时,它确实给出了正确的答案。但是,当您提供的不是数组的内容时,相同的表达式会提供一些虚假的内容。例如,如果你有

      int * p;
      
      然后
      countof(p)
      在int指针和int大小相同的机器上(例如在Win32平台上),始终为1

      此宏还错误地接受具有成员函数运算符[]的类的任何对象。例如,假设您编写

      class IntArray {
      private:
          int * p;
          size_t size;
      public:
          int & operator [] ( size_t i );
      } x;
      
      然后
      sizeof(x)
      将是x对象的大小,而不是
      x.p
      指向的缓冲区的大小。因此,通过
      countof(x)
      无法得到正确答案

      因此我们得出结论,定义1是不好的,因为编译器不能防止您误用它。它无法强制只能传入数组

      什么是更好的选择

      好的,如果我们想让编译器确保countof的参数总是一个数组,我们必须找到一个只允许数组的上下文。同一上下文应拒绝任何非数组表达式

      一些初学者可能会尝试此(定义2)

      #define countof( array ) ( sizeof( array )/sizeof( array[0] ) )
      
      template <typename T, size_t N>
      size_t countof( T array[N] )
      {
         return N;
      }
      
      template <typename T, size_t N>
      size_t countof( T (&array)[N] )
      {
          return N;
      }
      
      我们能做些什么吗

      有人(我不知道它是谁——我只是在一段未知作者的代码中看到了它)想出了一个聪明的主意:将N从函数体移动到返回类型(例如,使函数返回一个由N个元素组成的数组),这样我们就可以在不实际调用函数的情况下得到N的值

      确切地说,我们必须使函数返回数组引用,因为C++不允许您直接返回数组。 这方面的实施是:

      template <typename T, size_t N>
      char ( &_ArraySizeHelper( T (&array)[N] ))[N];
      
      #define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
      
      表示
      \u ArraySizeHelper
      是一个函数,它返回对N个元素的字符数组的引用(注意&)

      接下来,函数参数是

      T (&array)[N]
      
      它是对N个元素的T数组的引用

      最后,
      countof
      被定义为函数
      \u ArraySize结果的大小
      
      int x[10];
      
      int y[ 2*countof(x) ]; // twice as big as x
      
      int numArrElements = sizeof(myArray) / sizeof(int);
      
      int numArrElements = sizeof(myArray) / sizeof(myArray[0]);
      
      int array[4];
      
      sizeof(array) / sizeof(array[0])
      
      #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
      
      int array[6];
      ptrdiff_t nmemb;
      
      nmemb = ARRAY_SIZE(array);
      /* nmemb == 6 */
      
      void foo(int false_array[6])
      {
              ptrdiff_t nmemb;
      
              nmemb = ARRAY_SIZE(false_array);
              /* nmemb == sizeof(int *) / sizeof(int) */
              /* (maybe  ==2) */
      }
      
      void bar(int (*arrptr)[7])
      {
              ptrdiff_t nmemb;
      
              nmemb = ARRAY_SIZE(*arrptr);
              /* nmemb == 7 */
      }
      
      void numel(int array1[100][100])
      {
          int count=0;
          for(int i=0;i<100;i++)
          {
              for(int j=0;j<100;j++)
              {
                  if(array1[i][j]!='\0') 
                  {
                      count++;
                      //printf("\n%d-%d",array1[i][j],count);
                  }
                  else 
                      break;
              }
          }
          printf("Number of elements=%d",count);
      }
      int main()
      {   
          int r,arr[100][100]={0},c;
          printf("Enter the no. of rows: ");
          scanf("%d",&r);
          printf("\nEnter the no. of columns: ");
          scanf("%d",&c);
          printf("\nEnter the elements: ");
          for(int i=0;i<r;i++)
          {
              for(int j=0;j<c;j++)
              {
                  scanf("%d",&arr[i][j]);
              }
          }
          numel(arr);
      }