函数参数表中的数组实际上是指针
sizeof(a)==sizeof(int*)
但是指针传进函数之后,可以用数组的运算符[]进行运算。
#include <stdio.h> void minmax(int a[],int len,int* min,int* max); main(){ int a[]={1,2,3,4,5,6,7,8,9,6,5,45,65}; int min,max; printf("main %d\n",sizeof(a)); printf("main %p\n",a); minmax(a,sizeof(a)/sizeof(a[0]),&min,&max); printf("%d %d",min,max); return 0; } void minmax(int a[],int len,int* min,int* max){ int i; printf("minmax %d\n",sizeof(a)); printf("minmax %p\n",a); *min=*max=a[0]; for(i=1;i<len;i++){ if(*min>a[i]) *min=a[i]; if(*max<a[i]) *max=a[i]; } }
输出:
这里,函数的原型改为void minmax(int *a,int len,int* min,int* max); 也是可以的。
因此,以下四种函数原型是等价的:
int sum(int *ar,int n);
int sum(int *,int n);
int sum(int ar[],int n);
int sum(int [],int n);
数组变量是特殊的指针
1、数组变量本身表达地址,所以int a[10];int *p=a; //无需用&取地址;
2、但是数组的单元表达的是变量,需要用&取地址,例如:
int a[10]={12,34,5,56,7,8,9};
int *p=&a[4]; //把a[4]的地址赋给指针变量p;
3、数组变量表达的地址和数组第一个元素的地址是相同的。例如:a==&a[0];
4、[]运算符可以对数组做,也可以对指针做:p[0]<==>a[0];
5、*运算符可以对指针做,也可以对数组做:*a=25;
6、数组变量是const的指针,不能被赋值。所以不存在将一个数组赋给另一个数组。
int b[]=a[]; //这是错误的,因为int b[]==int *const b[],而const 是不能被赋值的.