如果传一个普通变量,那么参数接收到的是值
如果传一个指针,那么参数接收到的也是值,只不过这个值是地址
1.传入函数的数组成了什么?
函数参数表中的数组实际上是指针
sizeof(a)==sizeof(int*)
但是可以用数组的运算符[]进行计算
void minmax(int a[],int len,int *max,int *min);
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};
int min,max;
printf("main sizeof(a)=%lu\n",sizeof(a));//main sizeof(a)=68
printf("main a=%p\n",a);//a的地址:main a=0060FEBC
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
printf("minmax sizeof(a)=%lu\n",sizeof(a));//minmax sizeof(a)=4 函数参数里的数组就是个指针,只是看着像数组
//因此若把参数里的int a[]改成int *a也是正确的
printf("minmax a=%p\n",a);//a的地址:minmax a=0060FEBC 地址一样,说明main和minmax中的数组就是同一个数组
*min=*max=a[0];
for(i=1;i<len;i++){
if(a[i]<*min){
*min=a[i];
}
if(a[i]>*max){
*max=a[i];
}
}
}
也因此,以下四种函数原型是等价的:
int sum(int *ar,int n);
int sun(int *,int);
int sum(int ar[],int n);
int sum(int[],int);
2.数组变量是特殊的指针
数组变量本身表达地址,所以
int a[10];int *p=a;//无需用&取地址
但是数组的单元表达的是变量,需要用&取地址
但a==a[0]; a的地址就等于a[0]的地址
[]运算符可以对数组做,也可以对指针做
p[0]<==>a[0]
同样*运算符可以对指针做,也可以对数组做
*a=25;
void minmax(int a[],int len,int *max,int *min);
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};
int min,max;
printf("main sizeof(a)=%lu\n",sizeof(a));//main sizeof(a)=68
printf("main a=%p\n",a);//a的地址:main a=0060FEBC
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
int *p=&min;//现在有一个*p,让它等于min的地址
printf("*p=%d\n",*p);//如果输出*p,就是min的值 *p=1
printf("p[0]=%d\n",p[0]);//与*p值相同 p[0]=1
printf("*a=%d\n",*a);//*a=1 就是a[0]的值
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
printf("minmax sizeof(a)=%lu\n",sizeof(a));//minmax sizeof(a)=4 函数参数里的数组就是个指针,只是看着像数组
//因此若把参数里的int a[]改成int *a也是正确的
printf("minmax a=%p\n",a);//a的地址:minmax a=0060FEBC 地址一样,说明main和minmax中的数组就是同一个数组
*min=*max=a[0];
for(i=1;i<len;i++){
if(a[i]<*min){
*min=a[i];
}
if(a[i]>*max){
*max=a[i];
}
}
}
实际上,数组变量是const的指针,所以两个数组间不能直接做赋值
int a[]<==>int* const a