sizeof与strlen的区别

来源:互联网 发布:centos如何进入命令行 编辑:程序博客网 时间:2024/06/05 11:06

一、sizeof

sizeof(...)是运算符,参数可以是数组、指针、类型、对象、函数等。

    数组——编译时分配的数组空间大小;

    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

二、strlen

    strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
    它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

char str[30]="abcdefghij";
int   a=strlen(str); a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。
int   b=sizeof(str); b=30;sizeof 计算的则是分配的数组str[30] 所占的内存空间的大小,不受里面存储的内容影响

sizeof(数组名)--数组名表示整个数组,计算的是整个数组的大小-单位是字节
&数组名--数组名表示整个数组,取出的是这个数组的地址
除此之外,所有的数组名都表示数组首元素的地址

     int a[] = {1,2,3,4};

     printf("%d\n",sizeof(a));-----4*4=16

     printf("%d\n",sizeof(a+0));------4
     printf("%d\n",sizeof(*a));-------4
     printf("%d\n",sizeof(a+1));------4
     printf("%d\n",sizeof(a[1]));-----4
     printf("%d\n",sizeof(&a));  -----4
     printf("%d\n",sizeof(*&a));  ----16
     printf("%d\n",sizeof(&a+1));-----4
     printf("%d\n",sizeof(&a[0]));----4

     printf("%d\n",sizeof(&a[0]+1));----4
字符数组
     char arr[] = {'a','b','c','d','e','f'};
     printf("%d\n", strlen(arr));//随机值

     printf("%d\n", strlen(arr+0));//随机值
     printf("%d\n", strlen(*arr));//err
     printf("%d\n", strlen(arr[1]));//err
     printf("%d\n", strlen(&arr));//随机值
     printf("%d\n", strlen(&arr+1));//随机值
     printf("%d\n", strlen(&arr[0]+1));//随机值

     printf("%d\n", sizeof(arr));  //6*1=6
     printf("%d\n", sizeof(arr+0));//4数组名表示首元素的地址
     printf("%d\n", sizeof(*arr)); //1(*arr代表字符'a'所有为1个字节)
     printf("%d\n", sizeof(arr[1]));//1
     printf("%d\n", sizeof(&arr)); //4地址
     printf("%d\n", sizeof(&arr+1));//4地址
     printf("%d\n", sizeof(&arr[0]+1));//4地址

char arr[] = "abcdef";
     printf("%d\n", strlen(arr));//6
     printf("%d\n", strlen(arr+0));//6
     printf("%d\n", strlen(*arr));//err
     printf("%d\n", strlen(arr[1]));//err
     printf("%d\n", strlen(&arr));//6
     printf("%d\n", strlen(&arr+1));//随机值
     printf("%d\n", strlen(&arr[0]+1));//5

     printf("%d\n", sizeof(arr));//7
     printf("%d\n", sizeof(arr+0));//4
     printf("%d\n", sizeof(*arr));//1
     printf("%d\n", sizeof(arr[1]));//1
     printf("%d\n", sizeof(&arr));//4
     printf("%d\n", sizeof(&arr+1));//4
     printf("%d\n", sizeof(&arr[0]+1));//4

char *p = "abcdef";
     printf("%d\n", strlen(p));//6
     printf("%d\n", strlen(p+1));//5
     printf("%d\n", strlen(*p));//err
     printf("%d\n", strlen(p[0]));//err
     printf("%d\n", strlen(&p));//随机值(p里存着'abcdef'中字符a的地址)
     printf("%d\n", strlen(&p+1));//随机值
     printf("%d\n", strlen(&p[0]+1));//5

     printf("%d\n", sizeof(p));//4
     printf("%d\n", sizeof(p+1));//4
     printf("%d\n", sizeof(*p));//1
     printf("%d\n", sizeof(p[0]));//1
     printf("%d\n", sizeof(&p));//4
     printf("%d\n", sizeof(&p+1));//4
     printf("%d\n", sizeof(&p[0]+1));//4

二维数组
    int a[3][4] = {0};
    printf("%d\n",sizeof(a));//48
    printf("%d\n",sizeof(a[0][0]));//4
    printf("%d\n",sizeof(a[0]));//16
    printf("%d\n",sizeof(a[0]+1));//4(第一行第二个元素的地址----a[0]代表第一行的数组名,所以表示第一行首元素的地址+1表示第一行第二个元素的地址)
    printf("%d\n",sizeof(a+1));//4(第二行第一个元素的地址)
    printf("%d\n",sizeof(&a[0]+1));//4(第二行第一个元素的地址)
    printf("%d\n",sizeof(*a));//16
    printf("%d\n",sizeof(a[3]));//16


原创粉丝点击