请教一个函数参数问题
#include <stdio.h>
#define Max 5
int *pf(int [],int n);
int k[Max];
int main()
{
int total=0,k;
int i[Max]={10,20,30,40,50};
int *ptr;
ptr=pf(i,Max);
printf("ptr=%p\n\n",ptr);
for(k=0;k<Max;k++)
{
printf("k[%d]=%d \n",k,*(ptr+k));
total+=*(ptr+k);
}
printf("total is %d\n",total);
return 0;
}
int *pf(int x[],int n)
{
int m;
int j[]={100,200,300,400,500};
for(m=0;m<n;m++)
{
k[m]=j[m]+x[m];
printf("k[%d]=%d\n",m,k[m]);
}
printf("k=%p\n",k);
return k;
}
问题:
在函数int *pf(int x[],int n)中,要求输入参数类型是 int x[] 也即等价于 : int *x, 属于地址类型,那么为何在k[m]=j[m]+x[m],可以使用x[m]这种方式? 这个是一个值,而不是一个地址类型,请各位指点,谢谢!
[解决办法]
数组和指针有相似性,你传参数是a[],传的是数组的首地址(也是一个指针),通过a[i]移动指针;传参数*a,传的是指针的首地址,通过a++(也可用a[i])移动指针。
不同的是数组a[]是指针常量,不能用a++;而指针*a是指针变量,可以用a++,从某种意义上说,数组是指针的子集。
[解决办法]
a[3]==*(a+3)==3[a]
[]操作符本来就属于指针的用法,数组使用它还需要经过“数组名隐式转化为指向数组首元素的临时指针常量”
[解决办法]
不涉及类型转换的情况下:
指针值[下标值] 与 *(指针值+下标值)是一样的。
而“指针值”即可以是指针常量(如数组名)也可以是指针变量(它指向了数组首元素)
另外,函数的参数写成“type []", 实际上它不是数组,而是指针变量