sizeof是C语言中的一个运算符,用来计算数据类型所占空间的大小;strlen是一个函数,用来计算字符串长度。
下面用例子详细说明用法和区别:
首先说一下数组名什么时候表示整个数组,什么时候表示首元素地址?
- sizeof(数组名)-数组名表示整个数组
- &数组名-数组名表示整个数组
- 其他所有情况数组名都表示首元素地址
int数组
int a[] = { 1,2,3,4 };// 数组的大小4*4=16字节
printf("1%d\r\n", sizeof(a));
printf("2%d\r\n", sizeof(a + 0));
printf("3%d\r\n", sizeof(*a));
printf("4%d\r\n", sizeof(a + 1));
printf("5%d\r\n", sizeof(a[1]));
printf("6%d\r\n", sizeof(&a));
printf("7%d\r\n", sizeof(*&a));
printf("8%d\r\n", sizeof(&a + 1));
printf("9%d\r\n", sizeof(&a[0]));
printf("10%d\r\n", sizeof(&a[0] + 1));
解析:
- sizeof(数组名),计算数组的总大小,单位字节。16
- 这不是数组名直接放到sizeof中,所以是其他情况,表示首元素地址,地址就是4或者8字节。 4/8
- 首元素地址解引用表示首元素,首元素大小就是4
- 首元素地址,然后加1表示第二个元素的地址,地址就是4或者8字节。 4/8
- 第二个元素的大小4
- &a取出的就是数组的地址,地址的大小就是4或者8字节。 4/8
- &a取出的就是数组的地址,解引用就是整个数组,数组的大小就是16字节
- &a取出的就是数组的地址,加1就是下一个数组的地址,地址就是4或者8字节。 4/8
- 取第一个元素的地址。4/8
- 取第二个元素的地址。4/8
运行结果:
字符数组
char arr\[] = { 'a','b','c','d','e','f' };//每个字符是一个字节,1\*6=6
//sizeof
printf("1%d\r\n", sizeof(arr));
printf("2%d\r\n", sizeof(arr + 0));
printf("3%d\r\n", sizeof(\*arr));
printf("4%d\r\n", sizeof(arr\[1]));
printf("5%d\r\n", sizeof(\&arr));
printf("6%d\r\n", sizeof(\&arr + 1));
printf("7%d\r\n", sizeof(\&arr\[0] + 1));
//strlen
//strlen寻找数组长度,找到'\0\结束,
printf("1%d\r\n", strlen(arr));
printf("2%d\r\n", strlen(arr + 0));
//printf("3%d\r\n", strlen(\*arr));
//printf("4%d\r\n", strlen(arr\[1]));
printf("5%d\r\n", strlen(\&arr));
printf("6%d\r\n", strlen(\&arr + 1));
printf("7%d\r\n", strlen(\&arr\[0] + 1));
解析:
sizeof:
- 计算数组的大小。6
- 表示首元素地址,地址就是4或者8字节。4/8
- 首元素地址解引用表示首元素,首元素大小就是1
- 第二个元素的大小1
- &arr取出的就是数组的地址,地址的大小就是4或者8字节。 4/8
- &arr取出的就是数组的地址,加1就是下一个数组的地址,地址就是4或者8字节 。4/8
- 取第二个元素的地址。4/8
strlen:(strlen计算数组长度,找到'\0‘结束)
- arr没有定义长度,所以'\0'不确定在什么地方,随机值
- 同上-随机值
- 首元素地址解引用表示首元素,首元素是a对应的ascii码是97,strlen会找到地址是97的地方继续往后找--错误,非法访问地址
- 同上
- &arr取出的就是数组的地址,同一二,随机值
- &arr取出的就是数组的地址,加1就是下一个数组的地址,随机值
- 取第二个元素的地址,在b往后找'\0',随机值
运行结果:
字符串
char arr1[] = "abcdef";//字符串数组初始化的时候存储的是a b c d e f \0,所以是1*7=7
//sizeof:
printf("1%d\r\n", sizeof(arr1));
printf("2%d\r\n", sizeof(arr1 + 0));
printf("3%d\r\n", sizeof(*arr1));
printf("4%d\r\n", sizeof(arr1[1]));
printf("5%d\r\n", sizeof(&arr1));
printf("6%d\r\n", sizeof(&arr1 + 1));
printf("7%d\r\n", sizeof(&arr1[0] + 1));
//strlen
//strlen寻找数组长度,找到'\0\结束,
printf("1%d\r\n", strlen(arr1));
printf("2%d\r\n", strlen(arr1 + 0));
//printf("3%d\r\n", strlen(*arr1));
//printf("4%d\r\n", strlen(arr1[1]));
printf("5%d\r\n", strlen(&arr1));
printf("6%d\r\n", strlen(&arr1 + 1));
printf("7%d\r\n", strlen(&arr1[0] + 1));
解析:
sizeof:
- 计算字符串的大小。7
- 表示首元素地址,地址就是4或者8字节 。4/8
- 首元素地址解引用表示首元素,首元素大小就是1
- 第二个元素的大小1
- &arr取出的就是数组的地址,地址的大小就是4或者8字节 。4/8
- &arr取出的就是数组的地址,加1就是下一个数组的地址,地址就是4或者8字节。 4/8
- 取第二个元素的地址。4/8
strlen:
- 找到\0的时候,前面有6个字符。6
- 首元素地址加0不变,同上。6
- 首元素地址解引用表示首元素,首元素是a对应的ascii码是97,strlen会找到地址是97的地方继续往后找--错误,非法访问地址
- 同上
- &arr1取出的就是数组的地址,同一二。6
- &arr1取出的就是数组的地址,加1就是下一个数组的地址,下一个数组的\0不一定在什么地方。随机值
- 取第二个元素的地址,在b往后找'\0'。5
运行结果:
指针
char *p = "abcdefgh";//a b c d e f g h\0,把常量字符串首字母的地址放到p里面
//sizeof
printf("1%d\r\n", sizeof(p));
printf("2%d\r\n", sizeof(p + 1));
printf("3%d\r\n", sizeof(*p));
printf("4%d\r\n", sizeof(p[0]));
printf("5%d\r\n", sizeof(&p));
printf("6%d\r\n", sizeof(&p + 1));
printf("7%d\r\n", sizeof(&p[0] + 1));
//strlen
//strlen寻找数组长度,找到'\0\结束,
printf("1%d\r\n", strlen(p));
printf("2%d\r\n", strlen(p + 1));
//printf("3%d\r\n", strlen(*p));
//printf("4%d\r\n", strlen(p[1]));
printf("5%d\r\n", strlen(&p));
printf("6%d\r\n", strlen(&p + 1));
printf("7%d\r\n", strlen(&p[0] + 1));
解析:
sizeof:
- p是一个指针,放到sizeof中是计算一个指针变量的大小。4/8
- 表示第二个元素b地址,地址就是4或者8字节。4/8
- 首元素地址解引用表示首元素,首元素大小就是1
- 对于数组:arr[0] == (arr+0); 所以p[0]==(p+0)=='a'。1
- &p取出的就是p的地址,地址的大小就是4或者8字节。4/8
- &p取出的就是p的地址,加1就是下一个地址,地址就是4或者8字节 。4/8
- 取第二个元素的地址。4/8
strlen:
- 找到\0的时候,前面有8个字符。8
- 首元素地址加1是b的地址。7
- p就是a的地址,首元素地址解引用表示首元素,首元素是a对应的ascii码是97,strlen会找到地址是97的地方继续往后找--错误,非法访问地址
- 同上
- &p取出的就是p的地址,而p变量地址后面什么时候出现\0不确定--随机值
- &p取出的就是p的地址,而p变量地址+1后面什么时候出现\0不确定--随机值
- 取第二个元素的地址,在b往后找'\0'。7
运行结果: