通过函数检查数组的大小
Checking size of an array through function
当我想知道数组的大小时,我会执行以下操作:
int array[30];
for(int i = 0; i < 30; i++)
array[i] = i+1; //Fill list
const int size = sizeof(array) / sizeof(array[0]);
但是当我在函数中将数组作为参数传递时,我将在函数中有一个指针。
int size( int array[] )
{
return sizeof(array) / sizeof(array[0]); //Doesn't work anymore
}
这显然是行不通的。但是,如何在函数中获取该数组的大小,而无需为大小使用另一个参数?
如何在函数中获取该数组的大小而不采取 大小的另一个参数?
你没有。 数组的大小必须位于编译器可见的位置。 否则,您只能传递指向数组中第一个元素的指针。
但是,您可以使用template
来表示大小,并使其更加神奇和无缝:
template <size_t N> int size (const int (&ary)[N])
{
assert (N == (sizeof(ary) / sizeof (ary[0])));
return N;
}
并进一步模板化元素的类型,因此这适用于任何数组:
template <typename T, size_t N> int size (const T (&ary)[N])
{
assert (N == (sizeof(ary) / sizeof (ary[0])));
return N;
}
以下是使用函数模板获取数组大小的方法:
template <typename T, size_t N>
constexpr size_t size(const T (&)[N] ) // omit constexpr if no C++11 support
{
return N
}
然后
for(int i = 0; i < size(array); i++) { .... }
但是你可以通过使用std::array
(如果你没有C++11,或者std::tr1::array
或boost::array
)并使用它size()
方法来简化事情。
在 C 语言中,函数参数中的数组行为非常奇怪。 坦率地说,我认为这里的语言设计得非常糟糕。
void foo(int data[10]) {
int *p;
int a[10];
}
sizeof(p)
可能是 4(或 8)。sizeof(a)
将是 40(或 80)。
那么你认为sizeof(data)
会是什么? 如果你猜了40(或80),你就错了。 相反,它的大小与 sizeof(p)
.
如果 C 编译器在参数名称后立即看到一个[
,它会将其删除并替换为指针,data[10]
变为*data
。 (这与我们在其他地方使用数组的衰减行为不同,当参数时,数组被更彻底地处理)。
实际上,尽管数组大小不同,但以下内容仍会编译:
int foo(int data[10]);
int main() {
int hugearray[1000];
foo(hugearray); // this compiles!
}
C 编译器不以任何方式考虑数组参数的大小。 我认为编译器应该对任何数组参数发出警告,并鼓励我们直接使用该*
。 我可能允许[]
,但肯定不会[10]
,因为它被编译器忽略了。
如果希望 C 编译器尊重数组的大小,则应传递数组的地址。
int foo(int (*data)[10]);
int main() {
int smallarray[10];
foo(&smallarray); // OK
int hugearray[1000];
foo(&hugearray); // error, as desired
}
回到最初的问题,参数数组对它们的大小一无所知。
使用宏
int findSize(int array[])
{
//This will not return size off array,it will just get starting address array and no information about boundaries
return sizeof(array) / sizeof(array[0]);
}
//But we can define a Macro for this
#define FIND_ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
int main()
{
int SampleArray[30];
printf("nSize =%d ",sizeof(SampleArray) / sizeof(SampleArray[0]));
printf("nSize from Function =%d ",findSize(SampleArray));
printf("nSize from Macro =%d ",FIND_ARRAY_SIZE(SampleArray));
printf("n");
return 0;
}
在 C 中,您无法通过将数组起始地址传递给函数来找到数组的大小。
例如,您进行了函数调用
size(array); // You are calling function by passing address of array beginning element
int size( int array[] ) // this is same as int size(int *array)
{
return sizeof(array) / sizeof(array[0]); //Doesn't work anymore
}
在这里sizeof(array)
将为您提供指针的大小。 这取决于架构。
如果你传递字符数组而不是 int 数组,如果字符数组被终止,那么你也可以使用 strlen()
.这是我们找到数组大小的唯一方法。
strlen()
计数直到出现 null,您可以使用此技巧 但是为数组分配一个元素的内存或使用 MAX_SIZE+1 声明数组。当您存储大小为 n 的数组元素时,将已知值存储在 array[n] 中,并在查找大小时检查该值,例如strlen()
检查 Nul 字符。
- 试图让变量检查数组中的某些内容
- 如何在C++中检查2D数组中负值的输入验证
- 使用for循环检查数组中的重复项
- 检查TCHAR数组输入是否为带符号整数C++
- std::数组边界检查如何工作?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- C++ 检查结果数组中有多少次数字
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- 如何检查一个字符是否与字符数组中的另一个字符匹配?
- 如何检查二维数组上的周围数字?
- 检查反向数组是否与原始数组相同
- 如何检查cin是否与数组中的一组数字匹配
- 如何检查数组中是否没有值
- 如何检查字节数组是protobuf序列化字节数组还是普通字节数组
- 检查彩虹数组(检查数组的反向样式是否与自身匹配)
- 使用数组检查连续性
- c++ 根据随机生成的数组检查用户输入的值
- 使用字符串数组检查用户输入