sizeof()
sizeof 在是用来判断数据类型或者表达式的长度符,(注意:它和strlen不一样它只是一个操作符,而strlen()为一个函数)
MSDN上的解释为:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.
语法形式:
sizeof(object);//sizeof(对象)
sizeof(type_name);//sizeof(类型)
所以,
int i;
sizeof( i ); // ok
sizeof( int ); // ok
strlen()
strlen() 是计算字符串的实际长度的函数
头文件 : string.h
格式 :strlen (字符数组名)
功能 :计算字符串s的(unsigned int型)长度,不包括’\0’在内
说明 :返回s的长度,不包括结束符NULL
sizeof和strlen的区别
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。
而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是操作符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
⒋数组做sizeof的参数不退化,传递给strlen就退化为指针了。
⒌大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]=”0123456789”;
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
⒏当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
⒐数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
数组的运算
接下来我们用sizeof进行数组运算(//后为运行结果)
需要知道的是只有这两种情况数组名才代表整个数组
int arr[5]={0};
1、sizeof直接加数组名sizeof(arr);
2、&数组名 &arr
代码1:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};(char类型1个字节大小)
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6 整个数组大小
printf("%d\n", sizeof(arr+));//4 第一个元素的地址
printf("%d\n", sizeof(*arr));//1 第一个元素大小
printf("%d\n", sizeof(arr[]));//1 第二个元素大小
printf("%d\n", sizeof(&arr));//4 数组的地址大小
printf("%d\n", sizeof(&arr+));//4 整个数组之后下一个空间的地址+1是偏移了一个数组的大小即f之后,但它仍是个指针,指针的大小永远为4
printf("%d\n", sizeof(&arr[]+));//4 第一个元素的地址
代码2:char arr[] = “abcdef”;
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 整个字符串大小 多了\0
printf("%d\n", sizeof(arr+));// 4第一个元素a的地址大小
printf("%d\n", sizeof(*arr));//1第一个元素大小
printf("%d\n", sizeof(arr[]));// 1第二个元素大小
printf("%d\n", sizeof(&arr));// 4整个字符串地址的大小
printf("%d\n", sizeof(&arr+));// 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
printf("%d\n", sizeof(&arr[]+));// 4第二个元素b地址的大小
代码3:int a[] = { 1, 2, 3, 4 };(int类型4个字节大小)
int a[] = { , , , };
printf("%d\n", sizeof(a + ));//4第一个元素地址的大小
printf("%d\n", sizeof(*a));//4 第一个元素的大小
printf("%d\n", sizeof(a + ));//4 第二个元素地址大小
printf("%d\n", sizeof(a[]));//4 第二个元素大小
printf("%d\n", sizeof(&a));//4 整个数组地址大小
printf("%d\n", sizeof(*&a));//16 整个数组大小
printf("%d\n", sizeof(&a + ));//4 整个数组之后下一个空间的地址+1是偏移了一个数组的大小即4之后,但它仍是个指针,指针的大小永远为4
printf("%d\n", sizeof(&a[]));//4 第一个元素地址的大小
printf("%d\n", sizeof(&a[] + ));//4 第二个元素地址的大小
代码4:char *p = “abcdef”;
char *p = "abcdef";
printf("%d\n", sizeof(p));//4 整个字符串地址大小
printf("%d\n", sizeof(p+));//4 第二个元素地址的大小
printf("%d\n", sizeof(*p));//1 第一个元素a大小
printf("%d\n", sizeof(p[]));//1第一个元素a大小
printf("%d\n", sizeof(&p));//4 第一个元素地址的大小
printf("%d\n", sizeof(&p+));//4 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
printf("%d\n", sizeof(&p[]+));//4 第二个元素大小
接下来我们用strlen进行数组运算(//后为运行结果)
代码1:char *p = “abcdef”;
char *p = "abcdef";
printf("%d\n", strlen(p));//6 整个字符串长度 不包括\0
printf("%d\n", strlen(p+));//5 第二个元素开始字符串长度
printf("%d\n", strlen(*p));//err *p是一个具体的值 系统崩溃
printf("%d\n", strlen(p[]));//err 同上
printf("%d\n", strlen(&p));//x 随机值 p地址(用二级指针来存放p的地址,也就是地址的地址)之后不知何时遇到\0停止
printf("%d\n", strlen(&p+));//x p地址之后的空间不知何时遇到\0停止
printf("%d\n", strlen(&p[]+));//5 第二个元素开始字符串长度
代码2:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//x 随机值 不知何时有\0停止
printf("%d\n", strlen(arr+));//x 同上
printf("%d\n", strlen(*arr));//err *arr是一个值 系统崩溃
printf("%d\n", strlen(arr[]));//err同上
printf("%d\n", strlen(&arr));//x
printf("%d\n", strlen(&arr+));//x
printf("%d\n", strlen(&arr[]+));//x
代码3:char arr[] = “abcdef”;
char arr[] = "abcdef";
printf("%d\n", strlen(arr));// 6 整个字符串长度不包括\0
printf("%d\n", strlen(arr+));// 6 整个字符串长的
printf("%d\n", strlen(*arr));// err 崩溃
printf("%d\n", strlen(arr[]));//err 崩溃
printf("%d\n", strlen(&arr));// 6 字符串长度
printf("%d\n", strlen(&arr+));//x 随机值偏移了整个数组大小 不知何时遇到\0停止
printf("%d\n", strlen(&arr[]+));// 5 第二个元素开始字符串长度