第6天:为什么数组传进函数后的sizeof不对了

124 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

sizeof(数组)

#include<studio.h>
int main(void)
{
    int a[]={1,2,3,4,5,6,7,8,9};
    int min,max;
    printf("main sizeof(a[])=%lu\n",sizeof(a));
    printf("main a=%p\n",a);
    minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
    printf("a[0]=%d\n",a[0]);
    printf("%d%d",min,max);
    return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
    int i;
    *min=*max=a[0];
    printf(“minmax sizeof(a[])=%lu\n”,sizeof(a));
    printf("minmax a=%p\n",a);
    a[0]=1000;
    for(i=1;i<len;i++){
        if(a[i]<*min){
            *min=a[i];
        }
        if(a[i]>max){
        *max=a[i];
        }
    }
}

main里的sizeof是68,minmax里的sizeof是4(4是一个指针的大小或者说一个地址的大小)
printf("main a=%p\n",a):看a的地址
结果:main 和 minmax 里面a的是相同地址,即这里的a数组是同一个数组。
综上所述,数组是指针

  • sizeof(a)==sizeof(int *)
  • 但是可以用数组的运算符[]进行运算 数组参数
  • 以下四种函数原型是等价的
  • int sum(int *ar,int n);
  • int sum(int *, int);
  • int sum(int ar[], int n);
  • int sum(int [],int); 数组变量是特殊的指针
  • 数组变量本身表达地址
    • int a[10];int *p=a;//无需用&取地址
    • 但是数组的单元表达的是变量,需要用&取地址
    • a==&a[0]
  • []运算符可以对数组做,也可以对指针做;
    • p[0]<==>a[0]
    • *运算符可以对指针做,也可以对数组做
    • 数组变量是const的指针,所以不能被赋值
      • int a[]<==>int *p const a=....
    int *p=&min;
    printf("*p=%d",*p);
    printf("p[0]=%d",p[0]);
    

    *p==p[0]
    输出值都是2,都是为了取出p所指向的地址存放的数值

    printf("*a=%d",*a);
    

    输出为1000

    int b[];
    b=a;
    

    数组之间不能互相赋值,数组是常量指针,被创建后不能被改变。

指针与const

const:不能被修改
指针=指针+指针所指的变量

  1. 指针是const
  • 表示一旦得到了某个变量的地址。不能再指向其他变量
    • int * const q=&i;//q只能指向i的地址
    • *q=26;//OK//可以对q指向的地址的值进行操作
    • q++;//ERROR//但是不能对q进行运算
  1. 所指是const
  • 表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
    • const int *p=&i;//
    • *p =26;//ERROR//不能通过这个指针去修改这个指针指向的变量的值
    • i=26;//OK//i可以被修改
    • p=&j;//OK//p也可以被修改 q:判断的标志是const在*的前面还是后面
    int i;
    const int * p1=&i;
    int const * p2=&i;
    int * const p3=&i;