sizeof(关键字) :C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
strlen(函数):
所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。属头文件<string.h>,只有在C/C++语言中规定\0作为字符串结束标志,不算字符串内容。
//32位平台下的类型大小
printf("%d\n",sizeof(long long)); //8
printf("%d\n",sizeof(double)); //8
printf("%d\n",sizeof(int)); //4
printf("%d\n",sizeof(char)); //1
printf("%d\n",sizeof(float)); //4
printf("%d\n",sizeof(long)); //4
printf("%d\n",sizeof(short)); //2
printf("%d\n",sizeof(long double)); //8
数组名单独放在sizeof后面表示整个数组大小
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16 整个数组大小
printf("%d\n",sizeof(a+0)); //4 首元素地址
printf("%d\n",sizeof(*a)); //4 首元素大小
printf("%d\n",sizeof(a+1)); //4 第二个元素的地址
printf("%d\n",sizeof(a[1])); //4 第二个元素大小
printf("%d\n",sizeof(&a)); //4 数组的地址
printf("%d\n",sizeof(*&a)); //16 数组的地址解引用,表示整个数组
printf("%d\n",sizeof(&a+1)); //4 跳过整个数组,指向数组后面的一个地址
printf("%d\n",sizeof(&a[0])); //4 首元素地址
printf("%d\n",sizeof(a[0]+1)); //4 第二个元素的地址
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); //6 整个数组大小
printf("%d\n", sizeof(arr+0)); //4 首元素地址大小
printf("%d\n", sizeof(*arr)); //1 首元素大小
printf("%d\n", sizeof(arr[1])); //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)); //x 从首元素地址开始,向后找'\0'
printf("%d\n", strlen(arr+0)); //x 随机值
//printf("%d\n", strlen(*arr)); //error 把字符a传入
//printf("%d\n", strlen(arr[1])); //error
printf("%d\n", strlen(&arr)); //随机值
printf("%d\n", strlen(&arr+1)); //随机值 跳到整个数组后面
printf("%d\n", strlen(&arr[0]+1)); //随机值
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4 a的地址
printf("%d\n", sizeof(p+1)); //4 b的地址
printf("%d\n", sizeof(*p)); //1 解引用为指向一个字符的大小
printf("%d\n", sizeof(p[0])); //1 首元素
printf("%d\n", sizeof(&p)); //4 p的地址
printf("%d\n", sizeof(&p+1)); //4 p之后的地址
printf("%d\n", sizeof(&p[0]+1)); //4 指向b的地址
printf("%d\n", strlen(p)); //6 从a开始找
printf("%d\n", strlen(p+1)); //5 从b开始找
//printf("%d\n", strlen(*p)); //error 把字符a传入
//printf("%d\n", strlen(p[0])); //error
printf("%d\n", strlen(&p)); //随机值
printf("%d\n", strlen(&p+1)); //随机值
printf("%d\n", strlen(&p[0]+1)); //5 从b开始找
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7 整个数组大小
printf("%d\n", sizeof(arr+0)); //4 首元素地址
printf("%d\n", sizeof(*arr)); //1 首元素
printf("%d\n", sizeof(arr[1])); //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)); //6 从a开始找
printf("%d\n", strlen(arr+0)); //6
//printf("%d\n", strlen(*arr)); //error 传入a字符
//printf("%d\n", strlen(arr[1])); //error
printf("%d\n", strlen(&arr)); //6 从a开始找
printf("%d\n", strlen(&arr+1)); //随机值 跳过数组开始找
printf("%d\n", strlen(&arr[0]+1)); //5 从b开始找
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48 整个数组大小
printf("%d\n",sizeof(a[0][0])); //4 首元素
printf("%d\n",sizeof(a[0])); //16 第一行元素
printf("%d\n",sizeof(a[0]+1)); //4 第一行的第二个元素地址
printf("%d\n",sizeof(a+1)); //4 第二行地址
printf("%d\n",sizeof(&a[0]+1)); //4 第二行地址
printf("%d\n",sizeof(*a)); //16 第一行
printf("%d\n",sizeof(*&a)); //48 整个数组
printf("%d\n",sizeof(a[3])); //16 第四行