user-0 提问: 数组长度。

回复:
user: user-1
content: 1)传递特殊值作为结束标志，不需要数组的大小。  2）直接计算数组的大小，然后传递给函数，这是C,C++通用的方式。 可以参考VC的 _countof宏，注意，必须数组应经定义才行，只有说明，没有定义是不行的 #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) 比如  #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) extern int a[]; int arr_op_bad(){    priintf("%d",_countof(a));//数组大小此时编译器，知道了，可以编译。     return _countof(a); }  int a[10];  int arr_op_bad(){     //此时可以求出了  priintf("%d",_countof(a));// 这是错误的，数组大小此时还不知道。    return _countof(a); }  3）C++模板函数，用数组引用传递，可以直接从参数得到数组大小  （不过没有必要，模板本身就需要一个参数，作为数组大小），   缺点是，这种情况对于动分配的数据，没辙。 比如模板函数： 可以直接匹配内置数组 template <typename T,int N>  int arr_op(T (&)a[N]){     for(int i=0;i<N;i++){        std:: cout<<a[i]<<" "<<std::endl;     }   } //或者直接使用， //要定义确定长度的数组的引用做形参 int arr_op(int &(a)[100]) {     for(int i=0;i<100;i++){          std:: cout<<a[i]<<" "<<std::endl;     }   } PS： VC有个 宏 _countof 用于计算模板参数 是这样的 #if !defined(_countof) #if !defined(__cplusplus) #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) #else extern "C++" { template <typename _CountofType, size_t _SizeOfArray> char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; #define _countof(_Array) sizeof(*__countof_helper(_Array)) } #endif #endif  C++ 11 还可以这样定义   template <typename T,int N> //C++11  constexpr  int arraysize(T (&)a[N]){return N; 既然N已经是参数了，可以直接返回 //return sizeof(a)/sizeof(T);  //和C的方式一样 }   constexpr 函数，可以返回常量表达式。

user: user-2
content: 问题确实在这个地方，你只用记住一句话，C语言中sizeof(指针)永远=4，数组名作为函数形参就是指针，可以在main函数中：int size=sizeof(array)/4;然后将size作为形参传入，便可得到6

user: user-3
content: 我想不用全部算吧，先找到比sum大的那个数，因为是升序么，后面的就可以不用算了。只算前面的不就少了好多，剩下的组合一下就好了

user: user-4
content: void find_two_numbers(int array[], int sum) 多传递一个数组长度的参数即可。

user: user-5
content: 默认情况下，C++中数组做形参，都会退化为指针，所以你的这种用法，在这个编译器下就是4 关于c++处理这种问题，微软都也无能为力，MFC的很多函数都这么干的，实在没办法  不过，C++是可以传数组作为参数进去的 不过这样的限制就是：你必须指定数组的元素个数，也就是说，你要是指定只能传6个元素的数组，那么你穿int a[5],你把a传进去就错了。

user: user-6
content: 涨姿势了，学习

user: user-7
content: void find_two_num(int array [],int len, int num) { 	for (int i=0;i<len-1 && array[i]<num;++i) 	{ 		for (int j=i+1;j<len;++j) 		{ 			if (array[i]+array[j] == num) 			{ 				printf("%d plus %d is %d\n",array[i],array[j],num); 				break; 			} 		} 	} 	printf("%s\n","Search Done!"); }  int main() { 	int a []={1,2,3,4,5,6,7,8,9}; 	find_two_num(a,sizeof(a)/sizeof(*a),15); 	return 0; }

user: user-8
content: 数组名作为参数传递的时候会退化成指针的，因此你的这句 void find_two_numbers(int array[], int sum) 其实array接收之后相当于一个int *类型的指针，因此任何指针使用sizeof()运算符结果都是4 这个可以再传一个数组长度的参数。

user: user-9
content: 引用 5 楼 sun_409965763 的回复:[quote=引用 1 楼 derekrose 的回复:] void find_two_numbers(int array[], int sum) { int i = 0; int j = sizeof(array); //问题在这  敏锐的直觉 问题就在这 你这样写的话 j永远是4 引用 2 楼 a345485527 的回复:此时array是个指针，sizeof就是4 要把数组的长度作为参数传进去 void find_two_numbers(int array[], int sum，int n)这里加个n，作为数组长度 引用 3 楼 user-13 的回复:数组作为函数参数被转成指针了，所以find_two_numbers(int array[], int sum)和find_two_numbers(int* array, int sum)是一个意思，因此sizeof(array)==sizeof(int*) 引用 4 楼 jw903 的回复:在32为编译器的条件下，sizeof(array)永远为为4，因为32编译器条件下，指针的字节数总是4  大家写的我都明白，假如我现在传进去的不是5个数，而是成百上千(未知的)，咱不能去数数到底有多少个，再在函数写明吧，要的是不管多少个数，有个公式或者其他办法来计算出来到底有多少个。不知道我表达清楚了么。。[/quote] int a[100000];//不管多少 int n=sizeof(a)/sizeof(*a);//这就计算出出了数组长度 然后把它当成参数传进去

user: user-10
content: #include <iostream> #include <stdlib.h> using namespace std;  void find_two_numbers(int array[], int sum, int len) {     int i = 0;     int j = len; //问题在这     while(i < j)     {         if(array[i] + array[j] < sum)         i++;         else if(array[i] + array[j] > sum)         j--;         else 		{ 		cout << "两个数为："<< array[i] <<          " "  <<array[j] << endl; 		break; 		}     } } int main(void) {     int length = 0;     int array[] = {1, 2, 3, 4, 5, 10};        length = sizeof(array)/sizeof(int);  //这样获得数组的长度      find_two_numbers(array, 14, length-1);      system("pause");     return 0; }  你是不是这个意思，测试通过，能得到你要的结果。但是你给的数组没有排好序啊，我自己又改了下数组初始化列表。

user: user-11
content: 把size作为参数传进去

user: user-0
content: 引用 1 楼 derekrose 的回复:void find_two_numbers(int array[], int sum) { int i = 0; int j = sizeof(array); //问题在这  敏锐的直觉 问题就在这 你这样写的话 j永远是4 引用 2 楼 a345485527 的回复:此时array是个指针，sizeof就是4 要把数组的长度作为参数传进去 void find_two_numbers(int array[], int sum，int n)这里加个n，作为数组长度 引用 3 楼 user-13 的回复:数组作为函数参数被转成指针了，所以find_two_numbers(int array[], int sum)和find_two_numbers(int* array, int sum)是一个意思，因此sizeof(array)==sizeof(int*) 引用 4 楼 jw903 的回复:在32为编译器的条件下，sizeof(array)永远为为4，因为32编译器条件下，指针的字节数总是4  大家写的我都明白，假如我现在传进去的不是5个数，而是成百上千(未知的)，咱不能去数数到底有多少个，再在函数写明吧，要的是不管多少个数，有个公式或者其他办法来计算出来到底有多少个。不知道我表达清楚了么。。

user: user-12
content: 在32为编译器的条件下，sizeof(array)永远为为4，因为32编译器条件下，指针的字节数总是4

user: user-13
content: 数组作为函数参数被转成指针了，所以find_two_numbers(int array[], int sum)和find_two_numbers(int* array, int sum)是一个意思，因此sizeof(array)==sizeof(int*)

user: user-9
content: 此时array是个指针，sizeof就是4 要把数组的长度作为参数传进去 void find_two_numbers(int array[], int sum，int n)这里加个n，作为数组长度

user: user-11
content: void find_two_numbers(int array[], int sum) { int i = 0; int j = sizeof(array); //问题在这  敏锐的直觉 问题就在这 你这样写的话 j永远是4