指针和数组

如果传一个普通变量,那么参数接收到的是值
如果传一个指针,那么参数接收到的也是值,只不过这个值是地址
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值