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));
解析:
1、sizeof(数组名),计算数组的总大小,单位字节。16
2、这不是数组名直接放到sizeof中,所以是其他情况,表示首元素地址,地址就是4或者8字节。 4/8
3、首元素地址解引用表示首元素,首元素大小就是4
4、首元素地址,然后加1表示第二个元素的地址,地址就是4或者8字节。 4/8
5、第二个元素的大小4
6、&a取出的就是数组的地址,地址的大小就是4或者8字节。 4/8
7、&a取出的就是数组的地址,解引用就是整个数组,数组的大小就是16字节
8、&a取出的就是数组的地址,加1就是下一个数组的地址,地址就是4或者8字节。 4/8
9、取第一个元素的地址。4/8
10、取第二个元素的地址。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:
1、计算数组的大小。6
2、表示首元素地址,地址就是4或者8字节。4/8
3、首元素地址解引用表示首元素,首元素大小就是1
4、第二个元素的大小1
5、&arr取出的就是数组的地址,地址的大小就是4或者8字节。 4/8
6、&arr取出的就是数组的地址,加1就是下一个数组的地址,地址就是4或者8字节 。4/8
7、取第二个元素的地址。4/8
strlen:(strlen计算数组长度,找到’\0‘结束)
1、arr没有定义长度,所以’\0’不确定在什么地方,随机值
2、同上-随机值
3、首元素地址解引用表示首元素,首元素是a对应的ascii码是97,strlen会找到地址是97的地方继续往后找–错误,非法访问地址
4、同上
5、&arr取出的就是数组的地址,同一二,随机值
6、&arr取出的就是数组的地址,加1就是下一个数组的地址,随机值
7、取第二个元素的地址,在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));
解析:
1、计算字符串的大小。7
2、表示首元素地址,地址就是4或者8字节 。4/8
3、首元素地址解引用表示首元素,首元素大小就是1
4、第二个元素的大小1
5、&arr取出的就是数组的地址,地址的大小就是4或者8字节 。4/8
6、&arr取出的就是数组的地址,加1就是下一个数组的地址,地址就是4或者8字节。 4/8
7、取第二个元素的地址。4/8
strlen:
1、找到\0的时候,前面有6个字符。6
2、首元素地址加0不变,同上。6
3、首元素地址解引用表示首元素,首元素是a对应的ascii码是97,strlen会找到地址是97的地方继续往后找–错误,非法访问地址
4、同上
5、&arr1取出的就是数组的地址,同一二。6
6、&arr1取出的就是数组的地址,加1就是下一个数组的地址,下一个数组的\0不一定在什么地方。随机值
7、取第二个元素的地址,在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));
解析:
1、p是一个指针,放到sizeof中是计算一个指针变量的大小。4/8
2、表示第二个元素b地址,地址就是4或者8字节。4/8
3、首元素地址解引用表示首元素,首元素大小就是1
4、对于数组:arr[0] == (arr+0);所以p[0]==(p+0)==‘a’。1
5、&p取出的就是p的地址,地址的大小就是4或者8字节。4/8
6、&p取出的就是p的地址,加1就是下一个地址,地址就是4或者8字节 。4/8
7、取第二个元素的地址。4/8
strlen:
1、找到\0的时候,前面有8个字符。8
2、首元素地址加1是b的地址。7
3、p就是a的地址,首元素地址解引用表示首元素,首元素是a对应的ascii码是97,strlen会找到地址是97的地方继续往后找–错误,非法访问地址
4、同上
5、&p取出的就是p的地址,而p变量地址后面什么时候出现\0不确定–随机值
6、&p取出的就是p的地址,而p变量地址+1后面什么时候出现\0不确定–随机值
7、取第二个元素的地址,在b往后找’\0’。7
运行结果:

二维数组
int arr2[3][4] = { 0 };//3*4=12个整型,12*4=48字符
printf("1%d\r\n", sizeof(arr2));
printf("2%d\r\n", sizeof(arr2[0][0]));
printf("3%d\r\n", sizeof(arr2[0]));
printf("4%d\r\n", sizeof(arr2[0] + 1));
printf("5%d\r\n", sizeof(*(arr2[0] + 1)));
printf("6%d\r\n", sizeof(arr2 + 1));
printf("7%d\r\n", sizeof(*(arr2 + 1)));
printf("8%d\r\n", sizeof(&arr2[0] + 1));
printf("9%d\r\n", sizeof(*(&arr2[0] + 1)));
printf("10%d\r\n", sizeof(*arr2));
printf("11%d\r\n", sizeof(arr2[3]));
解析:
1、二维数组的大小–48
2、表示第一行第一列元素的大小–4
3、arr2[0]直接放在sizeof中表示整个第一行,第一行的大小–16
4、arr2[0]没有直接放在sizeof中表示第一行首元素地址,加1表示第二个元素地址。–4/8
5、arr2[0]没有直接放在sizeof中表示第一行首元素地址,加1表示第二个元素地址。解引用是第二个元素–4
6、arr2表示第一行的地址,加1是第二行的地址–4/8
7、arr2表示第一行的地址,加1是第二行的地址,解引用是第二行数组–16
8、&arr2[0]是第一行地址,加1是第二行地址–4/8
9、&arr2[0]是第一行地址,加1是第二行地址,解引用是第二行数组–16
10、arr2是第一行地址,解引用是第一行数组–16
11、第四行的大小,实际没有第四行,但是sizeof不会真实访问第四行,会根据arr2的类型来判断出每行有16个字节–16
运行结果:

853

被折叠的 条评论
为什么被折叠?



