今天学习C语言时,主函数调用子函数,需要传递一个数组到子函数中,发现传递不过去,单布后返现其实传递过去的只是数组第一个元素的地址。下面看看程序:
这个程序我想要数组元素的个数,结果得到的却是0,所以说,调用子函数时,如果想要传递数组的元素个数时,要提前在主函数中算好了,不要想着把数组传过去,结果会和预想的结果不一样的。原因是传递的不是数组本身,而是一个数组元素的一个地址而已。下面是更改后的正确代码:
这个程序主要的功能是利用二分法在一个有序数组中查找一个数。
#include"stdio.h"
int chazhao(int arr[], int key, int sz) {
int left = 0;
int right = sz-1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] > key) {
right = mid - 1;
}
else if (arr[mid] < key) {
left = mid + 1;
}
else
return mid;
}
return -1;
}
int main() {
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int key = 3;
int sz = sizeof(arr) / sizeof(arr[0]);
int a = chazhao(arr, key, sz);
if (a != -1) {
printf("key=%d的下标是:%d", key, a);
}
else {
printf("找不到");
}
return 0;
}
数组名是什么?
数组名是首元素的地址
但是有两个例外:
1、sizeof(数组名)---数组名表示整个数组--计算的是整个数组的大小单位是字节
2、&数组名---数组名表示整个数组--取地址取出的是整个数组的地址。
下面的例子可以证明sizeof(arr)中的arr代表的是整个数组
下面的例子可以证明取地址数组名中的数组名代表的是整个数组。
&arr到&arr+1 用了14个字节,一个整型元素只用4个字节,这里却用了14个字节,足以说明&arr代表的是整个数组了。