对sizeof和strlen的理解

对于sizeof和strlen的了解

   sizeof做一个官方的认识:sizeof() 是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);C语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

strlen来说就有比较多的限制了,首先strlen要注意其后面的参数是否匹配,strlen匹配char *类型的参数(即参数必须是指针(地址)类型,如果是元素的话就报错),匹配不合法将产生随机值;strlen返回的大小计算是从指针所指向的那一处开始,直到遇到\0结束,返回数值大小;strlen不计算\0在内。通过以下列子大家可以更进一步的了解。

 

//一维数组

int a[]={1,2,3,4};

(1)printf("%d\n",sizeof(a));//16   (a单独放在sizeof括号内的时候表示整个数组,整个数组的大小即为4*4=16)
2)printf("%d\n",sizeof(a+0));//4  (这里的a表示的数组首元素的地址,大家不要被一长段话所蒙蔽,这段话总结起来就是地址,而地址的大小为4字节,所以输出4)
3)printf("%d\n",sizeof(*a));//4   (这里a同样表示数组首元素的地址,解引用*后表示数组首元素,即1,1是整形,字节大小为4,所以输出4)
4)printf("%d\n",sizeof(a+1));
//4   (a表示首元素的地址,a+1表示第二个元素的地址,同样不要被这么多的话所迷惑,总之还是地址,输出4)
5)printf("%d\n",sizeof(a[1]));
//4  (a[1]表示第二个元素的值,同(3))
6)printf("%d\n",sizeof(&a)); 
//4  (&a表示整个数组的地址,说白了还是地址,因此输出4)
7)printf("%d\n",sizeof(&a+1));
//4  (&a+1表示下一个数组的地址,当然还是地址,输出4)
8)printf("%d\n",sizeof(&a[0]));
//4(表示数组首元素的地址,输出4,要注意与(6)的不同)
9)printf("%d\n",sizeof(&a[0]+1));
//4 (表示数组第二个元素的地址,要注意和(7)区分开)

//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//6 (整个数组的大小,6*1)
printf("%d\n", sizeof(arr+0));//4 (数组首元素的地址,地址占4个字节)
printf("%d\n", sizeof(*arr));
//1  (解引用数组首元素的地址,即数组首元素,即字符a,大小为1)
printf("%d\n", sizeof(arr[1]));
//1  (数组第二个元素的大小,即b的大小,输出1)
printf("%d\n", sizeof(&arr));//4  (整个数组的地址)
printf("%d\n", sizeof(&arr+1));
//4  (跳过一个数组,下个数组的地址)
printf("%d\n", sizeof(&arr[0]+1));//4  (数组第二个元素的地址)

printf("%d\n", strlen(arr));//随机值 (arr是char类型的,而strlen匹配参数类型应该为char *类型,类型不匹配,产生随机值)
printf("%d\n", strlen(arr+0));//随机值  (同上)
printf("%d\n", strlen(*arr));
//error  (*arr即数组元素,strlen匹配上元素的时候会报错)
printf("%d\n", strlen(arr[1]));//errror  (同上)
printf("%d\n", strlen(&arr));//随机值   (&arr代表数组的指针,指向类型为int *,类型不匹配,产生随机值)
printf("%d\n", strlen(&arr+1));//随机值   (同上)
printf("%d\n", strlen(&arr[0]+1));
//随机值   (同上)


char *p = "abcdef";
printf("%d\n", sizeof(p));
//4  (p是一个指针,也就是地址,大小为4)
printf("%d\n", sizeof(p+1));//4 (表示下一个数组的地址,大小为4)
printf("%d\n", sizeof(*p));
//6 (表示*p的内容)
printf("%d\n", sizeof(p[0]));//1  (数组首元素的大小)
printf("%d\n", sizeof(&p));//4  (表示指针的地址,大小为4)
printf("%d\n", sizeof(&p+1));//4  (表示下一个指针的地址,大小为4)
printf("%d\n", sizeof(&p[0]+1));
//4  (表示下一个元素的地址)


printf("%d\n", strlen(p));
//6  (类型匹配,直到\0结束,大小为6)
printf("%d\n", strlen(p+1));//5  (从第二个元素的地址开始数,大小为5)
printf("%d\n", strlen(*p));
//error  (参数为元素,报错)
printf("%d\n", strlen(&p[0]));6 (从第一个元素开始往后数)
printf("%d\n", strlen(&p));//随机值 (从地址开始数)
printf("%d\n", strlen(&p+1));//随机值 (从\0后面开始数,直到遇到\0结束,产生随机值)
printf("%d\n", strlen(&p[0]+1));//5 (从第二个元素的地址开始数,遇到\0结束,大小为5)


//二维数组

Int a[3][4]={0};
printf("%d\n",sizeof(a));
//48 (整个数组元素的大小,3*4*4=48)
printf("%d\n",sizeof(a[0][0]));
//4 (第一行第一列元素的大小)
printf("%d\n",sizeof(a[0]));
//16 (第一行元素的大小:4*4=16)
printf("%d\n",sizeof(a[0]+1));
//4  (表示数组第一行第二列数组元素的地址,相当于a[0][1])
printf("%d\n",sizeof(a+1));
//4 (a表示数组首元素的地址,a+1表示下一个元素的地址)
printf("%d\n",sizeof(&a[0]+1));
//4  (同上)
printf("%d\n",sizeof(*a));//16 (二维数组看做一维数组,解引用)
printf("%d\n",sizeof(a[3]));//16 (第四行元素的大小,在数组中,不会因为越界而出现错误,只是计算而已)

   

猜你喜欢

转载自blog.csdn.net/sophie1314/article/details/80091413