C语言中sizeof和strlen的区别

sizeof是一个操作符,是用来计算变量(类型)所占内存空间的大小,不关注内存中存放的具体内容,单位是字节;sizeof这个操作符计算返回值的结果是size_t类型的,是无符号的整型。

strlen 是一个库函数,使用时要包含头文件#include <string.h>,是专门求字符串长度的,只针对字符串。从给定的地址向后一直找\0,统计\0之前出现的字符的个数

下面是对sizeof 和 strlen在数组中具体的列子:

 

//一维数组中

#include <stdio.h>

int main()

{

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

printf("%d\n", sizeof(a));//16

//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节

printf("%d\n", sizeof(a + 0));//4/8

//注意:X86操作系统下,是4个字节;X64操作系统下,是8个字节。

printf("%d\n", sizeof(*a));//4

//*a=a[0],*a中的a是数组首元素地址

printf("%d\n", sizeof(a + 1));//4/8

printf("%d\n", sizeof(a[1]));//4

//计算第二个的大小

printf("%d\n", sizeof(&a));//4/8

//&a取出的是数组的地址,数组的地址,也就是地址

printf("%d\n", sizeof(*&a));//16

//&a拿到的是数组地址,数组地址解引用是数组;&和*抵消

printf("%d\n", sizeof(&a + 1));//4/8

//&a数组地址

//&a的类型是int(*)[4]

//&a+1是从数组a的地址向后跳过了4个整型元素的数组的大小

printf("%d\n", sizeof(&a[0]));//4/8

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

//&a[0]+1是第二个元素的地址,大小是4或者8个字节

return 0;

}

//字符数组中

#include <stdio.h>

int main()

{

char arr[] = { 'a','b','c','d','e','f' };

printf("%d\n", sizeof(arr));//6

printf("%d\n", sizeof(arr + 0));//4/8

printf("%d\n", sizeof(*arr));//1

printf("%d\n", sizeof(arr[1]));//1

printf("%d\n", sizeof(&arr));//4/8

//整个数组的地址,是地址,所占内存4或者8个字节

printf("%d\n", sizeof(&arr + 1));//4/8

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

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));//随机值-6;

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

#include <stdio.h>

int main()

{

char arr[] = "abcdef";

//arr[]={ a b c d e f g \0}

printf("%d\n", sizeof(arr));//7

printf("%d\n", sizeof(arr + 0));//4/8

printf("%d\n", sizeof(*arr));//1

printf("%d\n", sizeof(arr[1]));//1

printf("%d\n", sizeof(&arr));//4/8

printf("%d\n", sizeof(&arr + 1));//4/8

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

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

return 0;

}

#include <stdio.h>

int main()

{

char* p = "abcdef";

printf("%d\n", sizeof(p));//4/8

printf("%d\n", sizeof(p + 1));//4/8

printf("%d\n", sizeof(*p));//1

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

printf("%d\n", sizeof(&p));//4/8

printf("%d\n", sizeof(&p + 1));//4/8

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

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));//随机值

printf("%d\n", strlen(&p + 1));//随机值

printf("%d\n", strlen(&p[0] + 1));//5

return 0;

}

//二维数组中

#include <stdio.h>

int main()

{

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

//a[0]是第一行这一个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个一维数组,计算的就是第一行的大小;

printf("%d\n", sizeof(a[0] + 1));//4/8

//a[0]+1就是第一行第二个元素的地址;

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

//*(a[0]+1)就是第一行第二个元素;

printf("%d\n", sizeof(a + 1));//4/8

//a虽然是二维数组的地址,但是没有单独放在sizeof内部,也没有区地址;a表示首元素地址,二维数组首元素地址是它的第一行,a就是第一行的地址;a+1就是跳过第一行,表示第二行的地址;

printf("%d\n", sizeof(*(a + 1)));//16

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

//&a[0]是对第一行的数组名取地址,拿到的是第一行的地址

//&a[0]+1得到的是第二行的地址;

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

printf("%d\n", sizeof(*a));//16

printf("%d\n", sizeof(a[3]));//16

return 0;

}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值