如何正确使用指针数组?

#include <stdio.h>
void man(int*a[]);
void exchange(int*x,int*y);
int main()//求输入10个数求最大最小并把最大和最后一个数换最小和第一个数换,其它数的位置不变并输出要求必须用指针;
{
int*a[10],i;
int b[10];
/*
for(i=0;i!=10;i++)
scanf("%d",a[i]);
*/
for(i=0;i!=10;i++)//求最大和最小;这里为什么不能直接写成上面注销的那样呢?运行程序时提示程序出错!
{
scanf("%d",&b[i]);
a[i]=&b[i];
}
man(a);//这里传递过去的是什么呢?
for(i=0;i!=10;i++)
printf("%-4d",*a[i]);
printf("\n");
return 0;
}
void man(int*a[])//求最大和最小;
{
int i,*max,*min;
max=min=a[0];
for (i=1;i!=10;i++)
{
min=a[i]>max?a[i]:max;//这里更是不懂为什么比较地址就能求最大和最小开始写*min=*a[i]>*max?*a[i]:*max;也是不行,后来改成这就行了!
max=a[i]<min?a[i]:min;//
}
exchange(min,a[0]);
exchange(max,a[9]);
}
void exchange(int*x,int*y)//交换位置;
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void man(int*a[]);
void exchange(int*x,int*y);
int main()//求输入10个数求最大最小并把最大和最后一个数换最小和第一个数换,其它数的位置不变并输出要求必须用指针;
{
int*a[10],i;
int b[10];
/*
for(i=0;i!=10;i++)
scanf("%d",a[i]);
*/
for(i=0;i!=10;i++)//求最大和最小;这里为什么不能直接写成上面注销的那样呢?运行程序时提示程序出错!
{
scanf("%d",&b[i]);
a[i]=&b[i];
}
man(a);//这里传递过去的是什么呢?
for(i=0;i!=10;i++)
printf("%-4d",*a[i]);
printf("\n");
return 0;
}
void man(int*a[])//求最大和最小;
{
int i,*max,*min;
max=min=a[0];
for (i=1;i!=10;i++)
{
min=a[i]>max?a[i]:max;//这里更是不懂为什么比较地址就能求最大和最小开始写*min=*a[i]>*max?*a[i]:*max;也是不行,后来改成这就行了!
max=a[i]<min?a[i]:min;//
}
exchange(min,a[0]);
exchange(max,a[9]);
}
void exchange(int*x,int*y)//交换位置;
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int*a[10];
楼主其实自己都有怀疑,所以偷巧写成那样,这个其实应该写成:int* a[10]; (写成int *a[10];也是符合语法的,但会误导自己,以为指向的是int型数据,但编译器不会理解错,是你自己理解错)
表示a是储存10个int*指针的数组,是10个指针,不是10个int数据,所以这些指针全部是没有指向数据实体的,当把a[i]传给scanf()函数,scanf()把这个a[i]里面的指针值视为某个int型数据实体的地址,要对它进行解引用,给那个地址处的内存赋值,由于指针a[i]没有初始化,所以崩溃。
对,在语法上,编译器接受scanf("%d", a[i])这样的编码,但那仅仅是过了语法检查关,并不表示运行也能正确。scanf()需要指针,你就给它指针,但指针指向对不对,编译器是无法检查出来的。
不要把int* i当作定义了一个int数据,这是我反复说过的。有人必然有名片,但有名片不必然就有人,人是数据实体,指针只是名片,名片是可以乱印的。都把指针当神器,但如果不深刻了解,只能是搬起石头砸自己的脚。写出int*a[10]这样的代码,必须自己很清楚那是什么意思,能够怎么用,必须怎么用,搞不清楚,就老老实实地定义int a[10],就如下面int b[10]能用一样。定义指针之后,总得在内存中开辟数据实体,除了数据实体本身占用的内存之外,还附带多了一个指针变量也占用内存的开销,省不了内存(其实按指针寻址是间接寻址,操作是先取指针地址值定位地址然后再取值,步骤比直接寻址多了两步,时间上也不占优),但更容易令你出错。指针用在该用的地方,而且能不用就尽量不用,不要被人误导,总想用指针显威风,没有任何一本编程实用指南指导程序员尽量采用指针。信不信由你,未出校门的人就喜欢中这种毒,将来害死你的时候,不要后悔。
指针,是在程序的实际迫使不得不用,或者能够使代码显得更清晰、表达更自然的时候,应该采用。如果不具备这样的效果,就不要用,哪怕牺牲一点点速度性能,也要优先保证代码的清晰性和可维护性,这才是正确性的保障基础,代码不清晰,连排错都成问题,排错的时间比赢得的那一点点毫秒级的时间多不知几千万倍,论人工按时间摊下来的成本,那么一点速度优势弥补得来吗。做项目的头儿,如果不懂衡量取舍这种综合关系,纯走技术路线,他根本没资格坐这位置,而凡是有这种观念的人,都注定不是做项目头子的料,不管他吹得多牛,一说这种话,就彻底暴露,要么是撒谎,要么是哪个傻瓜老板被南郭先生骗了。