sizeof和strlen的简单使用方法和区别

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]。代表一行数组的大小。
我为初学,有错误还望指出,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_40421919/article/details/79749589