1. 程式人生 > >傳入函式的陣列和指標之間的關係

傳入函式的陣列和指標之間的關係

函式引數表中的陣列實際上是指標

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 是不能被賦值的.