两者区别:
1.sizeof 是一个操作符, strlen 是库函数。
2.sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以
结尾为‘\0‘的字符串作参数。
3.编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运
行时才计算的是数据类型占内存的大小,而 strlen 计算的是字符串实
际的长度;
**个人总结:sizeof针对计算机存储,考虑对象在计算机实际所占有的字节数;
strlen针对人眼,看见几个字符就占几个字符。**
实战讲解:
sizeof(int double bool short char long)?
sizeof(char* int* double*)?
答案:第一组:4 8 1 2 1 4 求的是基本类型所占的字节数
第二组:4 4 4 三种类型的指针 反正都是指针 指针所占空间大小总为4字节 与类型无关。
char s1[]="123456";
char *s2="123456";
char s3[10]={'1','2','3'};
char s4[]={'1','\0','2','\0'};
答案:
strlen:分别为:6 6 3 1
sizeof: 分别为:7 4 10 4
解释:strlen为人眼看到的,直接数,遇到‘\0’截止,这个不解释了吧 字符串结束标志,不懂得也别问我,好好去学习 。 sizeof是计算机模式,因为’\0’也会占内存,既然占了内存肯定要计算出来,不然其他对象覆盖了怎么办。s2为什么是4?因为它是一个指针呀。。。s3被初始化了,字节数=类型字节数乘以元素个数(1*10)。
数组与指针:
1. int *pi = new int[10]; //这是指针
2. sizeof(pi); // = 4
4. int ai[10];
5. int *p = ai; //这还是指针
6. sizeof(p); // = 4
7. double* (*a)[3][6]; //看成(double *) (*a)[3][6],即一个3×6的二维数组,数组元素 为指针,指向
//double类型。
8. sizeof(a); // = 4,a为指向上述二维数组的指针
9. sizeof(*a); // = sizeof(double *)*3*6 = 72,*a表示上述二维数组
10. sizeof(**a); // = sizeof(double *)*6 = 24,**a即*(*a),表示double*[6],是元素 为
//double指针的一维数组。
11. sizeof(***a); // = sizeof(double *) = 4,表示上述一维数组中的第一个元素,元素 类型为double指针。
12. sizeof(****a); // = sizeof(double) = 8,表示上述数组首元素指向的double类型。
函数传递:
1. void acf(char p[3]) //参数类型是int[],表示指向int的指针
2. {
3. sizeof( p ); // = 4
4. }
5. void aif(int p[]) //参数类型是int[],表示指向int的指针
6. {
7. sizeof( p ); // = 4
8. }
9. void pif(int (*p)[6]) //参数类型是int (*)[6],表示指向int数组的指针
10. {
11. sizeof( p); // = 4
12. sizeof( *p ); // = sizeof(int)*6 = 24
13. }
14. void ppf(int *p[6]) //参数类型是int *[],表示指向int指针的指针
15. {
16. sizeof( p ); // = 4
17. sizeof( *p ); // = 4
18. }