sizeof和strlen的简单使用方法和区别
一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16 数组名表示整个数组,计算的是整个数组的大小,int在32位系统中是4个字节,所以4*4==16.
printf("%d\n",sizeof(a+0));//4 数组名表示首元素地址,(a+0表示数组中第一个元素地址)。32位指针变量是4个字节。
printf("%d\n",sizeof(*a));//4 表示数组中首地址的元素,定义为int,所以4个字节。
printf("%d\n",sizeof(a+1));4 数组中第二个元素的地址,相当于指针变量,32位指针变量是4个字节。
printf("%d\n",sizeof(a[1]));//4 数组中第二个元素,int类型,所以4个字节。
printf("%d\n",sizeof(&a));//4 //16-err 取出的是整个数组的地址,即指针变量,32位指针变量是4个字节。但是vc6运行是16,这是vc的bug。
printf("%d\n",sizeof(*&a));//16 整个数组的所有元素所占的内存,4*4==16。
printf("%d\n",sizeof(&a+1));//4 数组中第二个元素的地址,相当于指针变量,32位指针变量是4个字节。
printf("%d\n",sizeof(&a[0]));//4 数组中第一个元素的地址,相当于指针变量,32位指针变量是4个字节。
printf("%d\n",sizeof(&a[0]+1));//4 数组中第二个元素的地址,相当于指针变量,32位指针变量是4个字节。
字符数组
char arr[] = {'a','b','c','d','e','f'};
//strlen()求的是数组的实际长度,直到遇到第一个'\0',且不包括'\0'。
printf("%d\n", strlen(arr));//随机值 首元素地址往后数数组有'\0'才表示结束,不知道在哪里结束。
printf("%d\n", strlen(arr+0));//随机值 第一个元素地址往后数数组有'\0'才表示结束,不知道在哪里结束。
printf("%d\n", strlen(*arr));//err strlen()的参数必须是字符型指针,*arr是第一个元素。
printf("%d\n", strlen(arr[1]));//err strlen()的参数必须是字符型指针,arr[1]表示第一个元素。
printf("%d\n", strlen(&arr));//随机值 &arr指整个元素的地址,也指首个元素的地址,第一个元素地址往后数数组有'\0'才表示结束,不知道在哪里结束。
printf("%d\n", strlen(&arr+1));//随机值 第二个元素地址往后数数组有'\0'才表示结束,不知道在哪里结束。
printf("%d\n", strlen(&arr[0]+1));//随机值 第二个元素地址往后数数组有'\0'才表示结束,不知道在哪里结束。
printf("%d\n", sizeof(arr));//6 arr表示整个数组,计算的是整个数组的大小,单位是字节。6*1==6。
printf("%d\n", sizeof(arr+0));//4 第一个元素地址,相当于指针,32位指针变量是4个字节。
printf("%d\n", sizeof(*arr));//1 首元素地址的解引用,相当于数组中第一个元素。char类型大小1个字节。
printf("%d\n", sizeof(arr[1]));//1 首元素,char大小一个字节。
printf("%d\n", sizeof(&arr));//4 取出的是整个数组的地址,也相当与首元素地址,相当于指针,32位指针变量是4个字节。
printf("%d\n", sizeof(&arr+1));//4 第二个元素地址,相当于指针,32位指针变量是4个字节。
printf("%d\n", sizeof(&arr[0]+1));//4 第二个元素地址,相当于指针,32位指针变量是4个字节。
char arr[] = "abcdef";
//strlen()求的是数组的实际长度,直到遇到第一个'\0',且不包括'\0'。
printf("%d\n", strlen(arr));//6 字符串后面默认有'\0',因此数组从首元素往后数有6个字符。
printf("%d\n", strlen(arr+0));//6 字符串后面默认有'\0',因此数组从首元素往后数有6个字符。
//printf("%d\n", strlen(*arr));//err strlen()的参数必须是字符型指针,*arr是第一个元素。
//printf("%d\n", strlen(arr[1]));//err strlen()的参数必须是字符型指针,*arr是第一个元素。
printf("%d\n", strlen(&arr));//6 取出的是整个数组的地址,也是首元素地址,往后数有6个元素。
printf("%d\n", strlen(&arr+1));//随机值 整个数组地址+1,就跳到’\0'以外了,没有'\0'做结束标志。
printf("%d\n", strlen(&arr[0]+1));//5 第二个元素的地址往后数就有5个元素。
printf("%d\n", sizeof(arr));//7 整个数组的大小,包括'\0'。单位是字节。
printf("%d\n", sizeof(arr+0));//4 数组首元素地址,相当于指针变量。32位指针变量是4个字节。
printf("%d\n", sizeof(*arr)); //1 数组首元素,char类型字节为1。
printf("%d\n", sizeof(arr[1]));//1 数组第二个元素,char类型字节为1。
printf("%d\n", sizeof(&arr));//4 整个数组的地址,也是首元素地址,相当于指针变量。32位指针变量是4个字节。
printf("%d\n", sizeof(&arr+1));//4 整个数组地址+1,就跳到’\0'以外了,但是是地址,所以还是4。
printf("%d\n", sizeof(&arr[0]+1));//4 数组第二个元素的地址,相当于指针变量。32位指针变量是4个字节。
char* p = "abcdef";
printf("%d\n", strlen(p));//6 字符串后面默认有'\0',因此数组从首元素往后数有6个字符。
printf("%d\n", strlen(p+1));//5 指针字符串后面默认有'\0',因此数组从第一个元素往后数有5个字符。
//printf("%d\n", strlen(*p));//err strlen()的参数必须是字符型指针,*p是第一个元素。
//printf("%d\n", strlen(p[0]));//err strlen()的参数必须是字符型指针,p[0]是第一个元素。
printf("%d\n", strlen(&p));//随机值 p的地址不和字符串一起,因此不知道它的大小。
printf("%d\n", strlen(&p+1));//随机值 p的地址不和字符串一起,因此不知道它的大小。
printf("%d\n", strlen(&p[0]+1));//5 第二个元素地址往后数有5个。
printf("%d\n", sizeof(p));//4 p是指针变量,32位系统指针变量是4个字节。
printf("%d\n", sizeof(p+1));//4 p是指针变量,移动一位,还是指针。32位指针变量是4个字节。
printf("%d\n", sizeof(*p));//1 字符串中第一个字符,char类型大小为1。
printf("%d\n", sizeof(p[0]));//1 字符串中第一个字符,char类型大小为1。
printf("%d\n", sizeof(&p)); //4 指针p的地址,相当于指针变量。32位指针变量是4个字节。
printf("%d\n", sizeof(&p+1));//4 指针p的地址,再移动一位,还是地址。相当于指针变量。32位指针变量是4个字节。
printf("%d\n", sizeof(&p[0]+1));//4 字符串中第二个元素的地址,相当于指针变量。32位指针变量是4个字节。
int a[3][4] = {0};
printf("%d\n",sizeof(a));//48 a代表整个数组的大小,12个存储单元,每个单元都是 int 型,因此 12*4==48。
printf("%d\n",sizeof(a[0]));//16 a[0]表示二维数组第一行的大小,第一行有4个元素单位,都为int型,4*4==16。
printf("%d\n",sizeof(a[0]+1));//4 此时的a[0]降级变成二维数组第一行首元素地址,因而 a[0]+1 为第一行第二个元素地址。
printf("%d\n",sizeof(a+1));//4// 第二行的地址
printf("%d\n",sizeof(&a[0]+1));//4 第二行的地址
printf("%d\n",sizeof(*a));//16 *a 代表二维数组第一行的所有元素,因此4*4==16。
printf("%d\n",sizeof(a[3]));//16 sizeof不参加运算,只看类型,a[3] 等同于a[1]或者a[2]。代表一行数组的大小。
我为初学,有错误还望指出,谢谢。