为什么数组传进函数后的sizeof不对了

举报
吴梦青 发表于 2022/06/04 21:19:19 2022/06/04
1.2k+ 0 0
【摘要】 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(...

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;
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。