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数组中不能混用不同的数据类型,而且所有数组元素的大小都应该相同(如果我是对的话),因此您可以通过以下小技巧利用这一点:
在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]); }
如果我们不知道数组中的元素数以及用户在运行时何时给出输入。然后我们可以将代码编写为 C代码:int数组[]={10,20,30,40}; int i; 对于(i=0;i
C++代码:while(scanf(“%d”),&array[count])==1{ 计数++; }
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;
在int指针和int大小相同的机器上(例如在Win32平台上),始终为1 此宏还错误地接受具有成员函数运算符[]的类的任何对象。例如,假设您编写countof(p)
然后class IntArray { private: int * p; size_t size; public: int & operator [] ( size_t i ); } x;
将是x对象的大小,而不是sizeof(x)
指向的缓冲区的大小。因此,通过x.p
无法得到正确答案 因此我们得出结论,定义1是不好的,因为编译器不能防止您误用它。它无法强制只能传入数组 什么是更好的选择 好的,如果我们想让编译器确保countof的参数总是一个数组,我们必须找到一个只允许数组的上下文。同一上下文应拒绝任何非数组表达式 一些初学者可能会尝试此(定义2):countof(x)
#define countof( array ) ( sizeof( array )/sizeof( array[0] ) )
template <typename T, size_t N> size_t countof( T array[N] ) { return N; }
我们能做些什么吗 有人(我不知道它是谁——我只是在一段未知作者的代码中看到了它)想出了一个聪明的主意:将N从函数体移动到返回类型(例如,使函数返回一个由N个元素组成的数组),这样我们就可以在不实际调用函数的情况下得到N的值template <typename T, size_t N> size_t countof( T (&array)[N] ) { return N; }
确切地说,我们必须使函数返回数组引用,因为C++不允许您直接返回数组。 这方面的实施是:
表示template <typename T, size_t N> char ( &_ArraySizeHelper( T (&array)[N] ))[N]; #define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
是一个函数,它返回对N个元素的字符数组的引用(注意&) 接下来,函数参数是\u ArraySizeHelper
它是对N个元素的T数组的引用 最后,T (&array)[N]
被定义为函数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); }