一般来说,获取数组的大小有两个库函数可以使用:strlen()
和sizeof()
strlen只能获取字符数组的大小(char)
sizeof可以获取任意类型的数组大小。
但值得注意的是,sizeof返回的数组的占用字节。所以要如下获取数组的长度
int len = sizeof(nums) / sizeof(nums[0]);//nums为定义的数组
但是在函数中,我们无法使用这种方法获得作为参数的数组的长度,一般需要将数组长度作为一个参数写入到函数中去。
如在一个二分查找的函数中
int b_search(int* nums, int len, int target) {
int left = 0;
int right = len - 1;//定义首尾位置
while (left<=right) {
int m = (left + right) / 2;
if (nums[m] < target) {
left = m + 1;
}
else if (nums[m] > target) {
right = m-1;
}
else {
return m;//得到索引值
}
}
return -1;//未找到,返回-1
}
参数中会包含一个len
,在主函数中得到数组的长度,传入到函数中去进而调用。
int main() {
int nums[7] = {1, 9, 18, 31, 55, 81, 97};//随便定义一个数组
int len = sizeof(nums) / sizeof(nums[0]);
int target_index = b_search(nums, len, 18);
if (target_index!=-1) {
printf("目标数据在数组的第%d个位置",target_index );
}
else {
printf("数组中无目标数据");
}
}
这是因为我们传入到函数中作为参数的数组,其实是我们定义的nums数组的首位元素的指针。
实际传入到函数 b_search 里的 int *nums,是 nums[0] 的指针
当我们使用 sizeof(nums )时,得到的也只是指针的大小,而并非数组的大小。
对于char形数组参数,可以在函数中用strlen()
获得它的长度。char形数组会以 \0 结尾,而对于int形的数组,末端是指针无法找到的。