user-0 提问: 一个函数，返回数组中最大和最小值的差值，但是我编写的程序中最大值和最小值始终是一样的。

回复:
user: user-0
content: 初学c,感谢大家的帮助，这个程序是习题，一定要指针。3楼的解释启发了我，指针指向的是一个地址，*运算符是取指针指向地址的值。我对程序做了修改，成功运行了。#include<stdio.h> double sub(double ar[],int i);//找出最大最小值并返回他们的差值 void main() { 	double res; 	double ar[]={1.1,2.2,3.3,4.4,5.5,6.6}; 	res=sub(ar,6); 	printf("数组中最大数和最小数之差是%Lf\n",res); 	system("pause"); }  double sub(double ar[],int i) { 	double sub; 	int n; 	double * min; 	double * max;  	min=ar; 	max=ar; //	*min=ar[0]; //	*max=ar[0]; 	for(n=0;n<i;n++) 	{ 		if(*min>ar[n])//如果当前的min比要比较的数大，那么则更新为比较小的数 			//*min=ar[n];这句是指针的地址不变，给指针指向的地址重新赋值。 			min=&ar[n];//这句是直接让指针指向一个新的地址，就不会和max指针发生冲突了。 		if(*max<ar[n])//如果当前的max比要比较的数小，那么则更新为比较大的数 			//*min=ar[n]; 			max=&ar[n]; 	} 	printf("max is %Lf,min is %Lf",*max,*min); 	sub=*max-*min; 	return sub; }

user: user-1
content: #include<stdio.h> #include<malloc.h> double sub(double ar[],int i);//找出最大最小值并返回他们的差值  int main() {     double res;     double ar[]={1.1,2.2,3.3,4.4,5.5,6.6};     res=sub(ar,6);     printf("数组中最大数和最小数之差是%Lf\n",res); 	 	return 0; }   double sub(double ar[],int i) {     double sub;     int n;     double * min;     double * max;       min = malloc(sizeof(double));     max = malloc(sizeof(double));     *min=ar[0];     *max=ar[0];     for(n=0;n<i;n++)     {         if(*min>ar[n])//如果当前的min比要比较的数大，那么则更新为比较小的数             *min=ar[n];         if(*max<ar[n])//如果当前的max比要比较的数小，那么则更新为比较大的数             *max=ar[n];     }     printf("max is %Lf,min is %Lf",*max,*min);     sub=*max-*min;      return sub; } vs2010编译通过，结果也没错。楼主思路是没什么错，完全按照逻辑来，于是用malloc，可能有点杀鸡用牛刀了。可能有其它更好的方法，但是我懒得想了。一楼的话可能有些伤人了，但是要敢问问题，不要怕丢脸，害羞什么的。当然，问的问题，应该是仔细思考后，实在无法独立解决的。

user: user-2
content: 楼主不清楚指针就不要乱用啊！两个指向了同一个地址， 好好看看指针吧 #include<stdio.h> double sub(double ar[],int i);//找出最大最小值并返回他们的差值 int main() { 	double res; 	double ar[]={1.1,2.2,3.3,4.4,5.5,6.6}; 	res=sub(ar,6); 	printf("数组中最大数和最小数之差是%Lf\n",res); //	system("pause"); 	 	return 0; }  double sub(double ar[],int i) { 	double sub; 	int n; 	double min; 	double max;  //	min=ar; //	max=ar; 	min=ar[0]; 	max=ar[0]; 	for(n=0;n<i;n++) 	{ 		if(min>ar[n])//如果当前的min比要比较的数大，那么则更新为比较小的数 			min=ar[n]; 		if(max<ar[n])//如果当前的max比要比较的数小，那么则更新为比较大的数 			max=ar[n]; 	} 	printf("max is %Lf,min is %Lf",max,min); 	sub=max-min; 	return sub; }

user: user-1
content: 当时十二点了，脑子不太好使，今天再看看，楼上说的没错，好像不用malloc

user: user-3
content: 实际开发中这个用指针可能确实有点儿复杂，不过研究一下指针的用法我觉得思路 不错呢。 呵呵，弱弱的说，我虽然大概知道问题在哪儿，但也不是完全想明白了，6楼的解答很有用，但是我理解声明min和max这两个指针变量的时候，不就已经为这两变量分配了存储地址了么？按照楼主的思路和我所理解的指针，不断改变指针指向内容，for循环执行结束后，这两个地址里面存储的内容，应该就是最大值、最小值的地址了呗，为啥还要malloc一下呢？

user: user-4
content: double sub(double ar[],int i) {     double sub;     int n;     double * min;     double * max;       min=ar; // 这里，你的min，max本身没有申请内存，而是同时指向了ar数组的第0个元素                     //*min,*max 实际上都是a[0]     max=ar;     *min=ar[0]; // 此时的*min实际上就是ar[0]，你这一行的代码相当于ar[0] = ar[0]     *max=ar[0];//*max实际上也是ar[0]，你这一行的代码依然还是相当于ar[0] = ar[0]     for(n=0;n<i;n++)     {         if(*min>ar[n])             *min=ar[n]; // *min实际上就是ar[0]，你这一行的代码相当于ar[0] = ar[n]         if(*max<ar[n])             *max=ar[n]; // *max实际上就是ar[0]，你这一行的代码相当于ar[0] = ar[n]     }          //以上找出来的最大值，最小值，统统都是存在ar[0]中的，所以你下面*max-*min     //相当于ar[0] - ar[0]           printf("max is %Lf,min is %Lf",*max,*min);     sub=*max-*min;     return sub; }

user: user-5
content: 怎么说呢，被你的指针绕晕了。 其实把指针全部去掉这个程序就差不多没什么问题了。

user: user-6
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-7
content: #include<stdio.h> double sub(double ar[],int i);//找出最大最小值并返回他们的差值 int main(void) { 	double res; 	double ar[]={1.1,2.2,3.3,4.4,5.5,6.6}; 	res=sub(ar,6); 	printf("数组中最大数和最小数之差是%Lf\n",res); 	//system("pause"); 	getchar(); 	return 0; }  double sub(double ar[],int i) { 	double sub; 	int n; 	double  min; 	double  max;  	//min=ar; 	//max=ar; 	min=ar[0]; 	max=ar[0]; 	for(n=0;n<i;n++) 	{ 		if(min>ar[n])//如果当前的min比要比较的数大，那么则更新为比较小的数 			min=ar[n]; 		if(max<ar[n])//如果当前的max比要比较的数小，那么则更新为比较大的数 			max=ar[n]; 	} 	printf("max is %Lf,min is %Lf",max,min); 	sub=max-min; 	return sub; } 不要乱用指针，你用两个指针指到同一个地址，那么从这个地址取出的值肯定是相同的.

user: user-8
content: 看到这个，我笑了。。。 #include<stdio.h> double sub(double ar[],int i);//找出最大最小值并返回他们的差值 void main() {     double res;     double ar[]={1.1,2.2,3.3,4.4,5.5,6.6};     res=sub(ar,6);     printf("数组中最大数和最小数之差是%Lf\n",res);     system("pause"); }   double sub(double ar[],int i) {     double sub;     int n;     double * min;     double * max;       min=ar;     max=ar;     for(n=0;n<i;n++)     {         if(*min>ar[n])//如果当前的min比要比较的数大，那么则更新为比较小的数             min=&ar[n];         if(*max<ar[n])//如果当前的max比要比较的数小，那么则更新为比较大的数             max=&ar[n];     }     printf("max is %Lf,min is %Lf",*max,*min);     sub=*max-*min;     return sub; }