在下面的函数中,我们如何找到数组的长度
int fnLenghthOfArray(int arry[]){
return sizeof(arry)/sizeof(int); // This always returns 1
}
此函数始终返回1.其中,sizeof(arry)/sizeof(int)
给出数组的实际长度,在声明它的函数中。
如果我们使用矢量或模板
template<typename T,int N>
int fnLenghthOfArray(T (&arry)[N]){
}
我们可以得到大小。但在这里我不允许更改功能原型。
请帮我找到这个。
请记住,在C中,当您将数组作为参数传递给函数时,您将传递一个指向该数组的指针。如果要传递数组的大小,则应将其作为单独的参数传递。
指针和int
的大小是4或8或其他 - 取决于ABI
。
在你的情况下,它是4
,所以你得到的sizeof(int *)/sizeof int
是1。
这是一个有用的技巧
您可以将数组的长度存储在它的第一个元素中:
int myArray[]= {-1, 1, 2, 3, 4, 5};
myArray[0] = sizeof(myArray) / sizeof(myArray[0]) - 1;
//The -1 because.. the first element is only to indicate the size
现在,myArray[0]
将包含数组的大小。
在函数声明中,qazxsw poi是一个指针:
array
在你的系统int fnLenghthOfArray(int arry[])
^
is same as int* array
。
你的功能声明
sizeof(int*) == sizeof(int)
相当于
int fnLenghthOfArray(int arry[]);
因此,您的计算得出1(基于int的指针大小和int的大小相同的假设)。
获取数组大小的唯一选择是提供一个额外的参数
int fnLenghthOfArray(int* arry);
或者,您可以使用其中一个C ++容器,如int fnLenghthOfArray(int arry[], std::size_t size);
或vector
array
相当于
int arry[]
当应用于arry时,sizeof()运算符返回4,因为它是指针的大小(或arry []情况下的引用),int的大小也是4个字节,这就是它总是返回1的原因。
要解决您的问题,您必须以不同的方式实现该数组。也许第一个元素应该总是具有数组的大小。否则,您可以使用STL或列表中的向量类。
int *arry
此函数返回1,因为正在执行指针大小和整数大小之间的除法。在大多数体系结构中,指针的大小等于整数的大小。例如,在int fnLenghthOfArray(int arry[]){
return sizeof(arry)/sizeof(int); // This always returns 1
}
架构中,两者都有4个字节的大小。
其中,sizeof(array)/ sizeof(int)给出数组的实际长度,在声明它的函数中
因为在这种情况下编译器知道x86
是一个数组及其大小。然而,在前一个函数中,编译器仅将arry
知道为指针。事实上,当你指定函数原型时,arry
和int arry[]
之间没有区别。
您无法在int * arry
或C
中获得数组大小。
这种语言的数组只是指向第一个元素的指针。你需要自己保持阵列的大小。
这是使用Maroun技巧的代码片段。
C++
#include<stdio.h>
void print_array(int *array);
void shift_array_normal(int *array,int arrayLen);
int main(void)
{
int array[]= {-1,32,44,185,28,256,22,50};
array[0] = sizeof(array) / sizeof(array[0]) - 1;
print_array(array);
return 0;
}
void print_array(int *array){
int index,arrayLen = array[0];
//length of array is stored in arrayLen now we can convert array back.
printf("Length of array is : %d\n",arrayLen);
//convert array back to normal.
shift_array_normal(array,arrayLen);
//print int array .
for(index = 0; index < arrayLen; index++)
printf("array[%d] = %d\n",index,array[index]);
}
/*removing length element from array and converting it back to normal array*/
void shift_array_normal(int *array,int arrayLen){
int index;
for(index = 0; index < arrayLen; index++)
array[index] = array[index + 1];
}
使用:
#include<iostream>
int main()
{
int array[300];
int d = sizeof(array)/4;
std::cout<<d;
}