大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#includestdio.h
创新互联建站服务项目包括道县网站建设、道县网站制作、道县网页制作以及道县网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,道县网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到道县省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
void Input(int *a,int n)
{int i;
for(i=0;in;i++)
scanf("%d",a+i);
}
int Max(int *a,int n)
{int i,max=*a;
for(i=1;in;i++)
if(*(a+i)max)max=*(a+i);
return max;
}
int Min(int *a,int n)
{int i,min=*a;
for(i=1;in;i++)
if(*(a+i)min)min=*(a+i);
return min;
}
float Avg(int *a,int n)
{int i,s=0;
for(i=0;in;i++)
s+=*(a+i);
return (float)s/n;
}
int main()
{ int a[10];
Input(a,10);
printf("最低分=%d\n",Min(a,10));
printf("最高分=%d\n",Max(a,10));
printf("平均分=%.1f\n",Avg(a,10));
return 0;
}
你的2个程序是不同的。关键知识是: 普通指针 和 数组指针 的 不同点。
下面是简单的说明。
int *p; 是普通的指针,指向一个地址。
p=a; 让它指向2维数组的始地址。由于数组是按行排列,所以下标[i,j] 的 元素 a[i][j] 排在 i*4+j 位,即: p[i*4+j]
printf("a[%d][%d]=%d\n",i,j, (p[i*4+j])); // 就是 输出 a[i][j]。
=========
int (*p)[4]; 这是数组指针,用于指向4个元素一行的数组。
p= a[0]; 让 它指向 数组 的开始地址。
程序中可以用 p[i][j] 代替 a[i][j] 使用。
printf("a[%d][%d]=%d\n",i,j, p[i][j]); // 就是 输出 a[i][j]。
*加地址变量是取这个地址里的值
数组的p[]就是这个数组p的第一个地址(也就是这个数组的地址),C语言自己会把a当做a[]
所以你传到函数里的*p指针就是a数组的首地址,即a,我一般写程序为了区分常写作a[],
而读上了这个数组的首地址以后*(p+i)就是取这个数组的首地址后的i个地址内的数据,而开的数组的地址是连续的,所以可以输出你数组里的数据,而最后输出的p[i]的操作方式是输出p数组的第i个数,说白了就是两种取数组里值的方法而已
子函数中定义的一般指针变量,在子函数结束之后会被自动释放,如果返回这种局部指针变量,调用者一般是不能正确读到指针地址中的数据的。
因此,如果想在主函数中输出自定义函数中定义的数组,就要在自定义函数中把数组定义为静态数组,然后返回数组名即可。
静态变量的生命周期是整个程序的生命期,从定义开始,直到程序结束,才会被释放。
参考代码:
#include stdio.h
char *get_str(void) //返回值类型为字符指针
{
static char str[100]={0};//静态变量初始化,只有在定义时这次完成,且初始化只执行一次。
sprintf(str,"hello world");
return str ;
}
void main()
{
char *p;
p=get_str();
printf("%s\n", p );
}
#includestdio.h
int main()
{
int array[10];
int i, *p;
for(p=array, i=0; i10; i++)
scanf("%d", p+i);
for(p=array, i=0; i10; i++)
printf("%d ", *(p+i));
return 0;
}