在我们每天的写代码过程中,我们都会用到这俩种库函数,我们想要知道计算sizeof和strlen的方法首先就要知道它们两表示什么意思,所以我们首先要有它们俩个的定义。
1.sizeof:计算字符串的大小,sizeof中的表达不参与运算;
2.strlen:计算字符串的长度,遇到‘\0’截止。
目录
1.一维数组下的sizeof与strlen
1.1一维数组(int型)下的sizeof
#define _CRT_SECURE_NO_WARNINGS 1
#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;a没有单独放在sizeof中,表示的是首元素
//地址,a+0也是首元素地址,地址就是4或者8字节.
printf("&d\n", sizeof(*a));//4;a表示数组首元素地址,*a就是首元素大小。
printf("&d\n", sizeof(a+1));//4/8;a+1表示第二个元素地址。
printf("&d\n", sizeof(a[1]));//4;a[1]表示第二个元素,为4字节。
printf("&d\n", sizeof(&a));//4/8;&数组名,数组名表示整个数组,取出的是
//整个数组的地址。
printf("&d\n", sizeof(*&a));//16;把数组整个取出解引用,4*4=16个字节。
printf("&d\n", sizeof(&a+1));//4/8;表示这个一维数组之后的一个地址,是
//地址就是4或8个字节。
printf("&d\n", sizeof(&a[0]));//4/8;表示首元素地址大小。
printf("&d\n", sizeof(&a[0]+1));//4/8;表示第二个元素的大小。
return 0;
}
1.sizeof(数组名),这个数组名表示整个数组,计算的是整个数组的大小;
2.sizeof(&数组名),数组名表示整个数组,取出的是整个数组的地址;
3.除此之外,sizeof后数组名的变形都是首元素的地址。
1.2一维数组(char型单个字符)下的sizeof
int main()//一维字符型
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6;arr单独放在sizeof内部,计算整个数组大小。
printf("%d\n", sizeof(*arr));//1;*arr是对数组首元素地址的解引用,
//计算的是数组首元素的大小。
printf("%d\n", sizeof(arr+0));//4/8;arr+0是数组首元素的地址。
printf("%d\n", sizeof(arr[1]));//1;arr[1]是数组第二个元素的大小。
printf("%d\n", sizeof(&arr));//4/8;&arr取出的是整个数组的地址。
printf("%d\n", sizeof(&arr+1));//4/8;&arr+1指的是arr之后的一块地址,是地址
//就是4或者8个字节。
printf("%d\n", sizeof(&arr[0]+1));//4/8;指的是数组第二个元素的地址。
return 0;
}
1.3一维数组(char型单个字符)下的strlen
int main()//一维字符型
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));//随机值;strlen遇到‘\0’停止。
printf("%d\n", strlen(*arr));//非法访问;*arr是首元素,即‘a’,对应
//ASCII值是97,即strlen(97),不能直接访问。
printf("%d\n", strlen(arr + 0));//随机值;
printf("%d\n", strlen(arr[1]));//非法访问;同*arr。
printf("%d\n", strlen(&arr));//随机值;
printf("%d\n", strlen(&arr + 1));//随机值;
printf("%d\n", strlen(&arr[0] + 1));//随机值;是第二个元素单独地址,求
//数组的字符串长度也是随机值。
return 0;
}
1.strlen求的是字符串长度,遇‘\0’停止;
2.strlen中放入对应ASCII值,不能直接访问,是非法的;
3.&arr虽然是数组的地址,但是也是从数组起始位置开始的,计算得到的结果还是随机值。
1.4一维数组(char型字符串)下的sizeof
int main()
{
char arr[] = "abcdef";
//共有7个元素,'a' 'b' 'c' 'd' 'e' 'f' '\0'
printf("%d\n", sizeof(arr));//7;计算的是整个数组的大小。
printf("%d\n", sizeof(arr+0));//4/8;arr+0表示数组首元素地址。
printf("%d\n", sizeof(*arr));//1;对数组首元素地址解引用,计算的是数组第一个
//元素的大小。
printf("%d\n", sizeof(arr[1]));//1;计算的是数组第二个元素的大小。
printf("%d\n", sizeof(&arr));//4/8;&arr取出的是整个数组的地址。
printf("%d\n", sizeof(&arr+1));//4/8;指的是这个数组之后一块空间的地址。
printf("%d\n", sizeof(&arr[0]+1));//4/8;指的是数组第二个元素的地址。
return 0;
}
1.5一维数组(char型字符串)下的strlen
int main()
{
char arr[] = "abcdef";
//共有7个元素,'a' 'b' 'c' 'd' 'e' 'f' '\0'
printf("%d\n", strlen(arr));//6;arr是数组首元素的地址,strlen从首元素
//地址开始统计,遇'\0'截止。
printf("%d\n", strlen(arr + 0));//6,;arr+0是数组首元素地址,同arr。
printf("%d\n", strlen(*arr));//非法访问;对数组首元素地址解引用,即
//strlen(a)-->strlen(97)不能直接访问。
printf("%d\n", strlen(arr[1]));//非法访问;即strlen(b),不能直接访问。
printf("%d\n", strlen(&arr));//6;&arr取出的是整个数组的地址,strlen从首元素
//地址开始统计,遇'\0'截止。
printf("%d\n", strlen(&arr + 1));//随机值;指的是这个数组之后一块空间
//的地址,计算的结果是随机值。
printf("%d\n", strlen(&arr[0] + 1));//5;指的是数组第二个元素的地址,
//从第二个元素开始统计,遇'\0'截止。
return 0;
}
2.一级指针下的sizeof和strlen
2.1一级指针下的sizeof
int main()//指针型
{
char* p = "abcdef";
printf("%d\n", sizeof(p));//4/8;p是指针变量,大小就是4/8.
printf("%d\n", sizeof(p+1));//4/8;p+1是b的地址。
printf("%d\n", sizeof(*p));//1;对首元素地址进行解引用,大小为1个字节。
printf("%d\n", sizeof(p[0]));//1;p[0]-->*p,就是1个字节。
printf("%d\n", sizeof(&p));//4/8;二级指针,指针就是4/8个字节。
printf("%d\n", sizeof(&p+1));//4/8;指跳过p变量之后的地址。
printf("%d\n", sizeof(&p[0]+1));//4/8;指第二个元素的地址。
return 0;
}
1.地址就是4或者8个字节,具体取决于编译器是x86还是x64。
2.不管是一级指针还是二级指针大小都是4或者8。
2.2一级指针下的strlen
int main()//指针型
{
char* p = "abcdef";
printf("%d\n", strlen(p));//6;求字符串长度。
printf("%d\n", strlen(p + 1));//5;从b的地址开始计算。
printf("%d\n", strlen(*p));//非法访问;原因同前例;
printf("%d\n", strlen(p[0]));//非法访问;
printf("%d\n", strlen(&p));//随机值;&p拿到的是p这个指针变量的起始地址,
//从这里开始求字符串长度是一个随机值。
printf("%d\n", strlen(&p + 1));//随机值;跳过p变量的地址,所求长度也是随机值。
printf("%d\n", strlen(&p[0] + 1));//5;从第二个元素地址开始统计。
return 0;
}
3.二维数组下的sizeof
int main()//二维数组
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48;sizeof(数组名)表示整个数组,
//计算的是整个数组的大小。
printf("%d\n", sizeof(a[0][0]));//4;计算数组首元素的大小。
printf("%d\n", sizeof(a[0]));//16;a[0]是数组第一行的数组名,数组名单独
//放在sizeof内部,计算的就是数组(第一行)的大小。
printf("%d\n", sizeof(a[0]+1));//4/8;a[0]作为第一行的数组名,没有单独
//放在sizeof内部,没有&,表示的就是数组首元素的地址,即a[0]-->a[0][0],
//则a[0]+1表示的就是数组第一行第二个元素的地址。
printf("%d\n", sizeof(*(a[0]+1)));//4;结合a[0]+1,我们对它进行解引用,
//得到的是第一行第二个元素的大小,也就是4字节。
printf("%d\n", sizeof(a+1));//4/8;数组名没有单独放在sizeof内部,数组名
//表示首元素地址,就是第一行的地址,a+1就是第二行的地址。
printf("%d\n", sizeof(*(a+1)));//16;*(a+1)-->a[1]计算第二行元素大小。
printf("%d\n", sizeof(&a[0]+1));//4/8;&a[0]是第一行地址,&a[0]+1就是第二行元素地址。
printf("%d\n", sizeof(*(&a[0]+1)));//16;*(&a[0]+1)-->a[1]-->*(a+1),
//计算第二行元素的大小。
printf("%d\n", sizeof(*a));//16;a表示数组第一行元素地址,*a-->a[0],计算的
//是数组第一行元素的大小。
printf("%d\n", sizeof(a[3]));//16;如果存在第四行,a[3]计算的就是数组
//第四行元素的大小。
return 0;
}
1.在二维数组中,sizeof(数组名)仍然表示整个数组的大小;
2.在二维数组中,a[0]单独放在sizeof内部表示的就是数组第一行的所有元素;
3.在二维数组中,&a[0]表示数组第一行元素的地址;
4.在二维数组中,sizeof(a+1),表示的是数组第二行元素的地址;
5.放在sizeof内部的表达式是不会参与运算的,所以a[3]也不存在越界访问的问题,只是查看,但并没有执行。
好了,今天的分享结束啦,还请大家好好学习,天天向上!!!