重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
问题在你这个函数的定义参数void find(float a[],float *pmax,float *pmin)
我们提供的服务有:网站设计、成都做网站、微信公众号开发、网站优化、网站认证、镇远ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的镇远网站制作公司
你在函数内对后2个参数直接进行了赋值。
{pmax=a[t];}
if(a[t]*pmin)
{pmin=a[t];}
你在函数内赋值并不会被外部的参数造成影响,你需要把用指针的引用才行
float* pMax, float* pmin
这样在函数内的赋值才有效果
因为数组的每一个元素在内存中是连续存放的,只要传递数据的首地址,你就可以根据对指针的"++"或--"操作,或直接在首地址上加上某个数,来得到数据其他的元素地址,然后用"*"操作符可以访问对应地址存放的数值。
比如,有如下这样语句:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 定义数组a
int *p = a; // 使指针p指向数据的首地址,类似给函数传递首地址
1、使用"++"操作符,p目前指向的是数组首地址,那么p++之后,p就应该指向存放数组第二个元素的地址,这样就可以用*p得到第二个元素的值(2)。依此类推。
2、可以直接对首地址加某一个数,比如p+4,因为p指向数组首地址,所以p+4就是指向存放数据第五个元素的地址。这样就可以用*(p+4)得到第五个元素的值(5)。其实这里的*(p+4)与p[4]效果是一样的,只是写法上的不同而已,但是p[4]更直观一些,所以大部分编程人员都愿意用p[4]这种形式,因为它看其来像个数组,更好理解一些。
总而言之,用数组首地址可以访问数组的所有元素,就是因为可以通过对首地址的相加减来得到其他元素的地址,从而可以得到数组的每一个元素值。
这样说,你明白了吧。
如果还不太明白,那就看看谭浩强的《C语言程序设计》的“数组与指针”篇,那里写的很详细的(P210)
用指针传递一维数组。
#include stdio.h
#include math.h
float dist( float *p1, float *p2){
float d[3],ds;
int i;
for (i=0;i3;i++) d[i] = p2[i]-p1[i];
ds = sqrt( d[0]*d[0]+ d[1]*d[1]+d[2]*d[2]);
return ds;
};
void vec( float *p1, float *p2, float *p3){
int i;
for (i=0;i3;i++) p3[i]=p1[i]+p2[i];
}
int main()
{
float a[3],b[3],c[3];
int i;
printf("input x y z for point 1\n");
for (i=0;i3;i++)scanf("%f",a[i]);
printf("input x y z for point 2\n");
for (i=0;i3;i++)scanf("%f",b[i]);
printf("distence: %g\n", dist(a,b));
printf("\n");
vec(a,b,c);
for (i=0;i3;i++) printf("%g ",c[i]);
return 0;
}
函数中的形参和调用时的实参都是数组名时,传递方式为(
地址传递
)
此时形参和实参共用同一段内存
都是变量时,传递方式为(
值传递
)
实参与形参互不影响
struct Student st;
void function(struct Student st);这种形式就是传递地址;
void fuction2(struct Student * pst);这种形式就是传递结构体的地址;
调用这两个函数的形式如下:
function(st);
fuction2(st);
一般推荐第二种方式,因为第一种方式需要传递整个结构体,需要开辟sizeof(struct student)这么大的内存空间,开销太大,第二种方式则只需要开辟四个字节的内存,用来存放地址;