传入函数的数组和指针之间的关系

函数参数表中的数组实际上是指针

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

猜你喜欢

转载自blog.csdn.net/zhanshen112/article/details/80793949