傳入函式的陣列和指標之間的關係
阿新 • • 發佈:2018-12-30
函式引數表中的陣列實際上是指標
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 是不能被賦值的.