sizeof()运算符
sizeof是c语言内置运算符,以字节为单位给出指定类型的大小,其作用就是返回一个对象或者类型所占的内存字节数。
用法:
1.用于数据类型 如:sizeof(Type)
运行结果如下:
2.用于变量 sizeof(var_name)
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
strlen()函数
原型:unsigned int strlen(const char *s)
头文件:string.h
Get the length of a string, using the current locale or a specified locale.
计算字符串s的(unsigned int型)长度,不包括’\0’在内.返回s的长度,不包括结束符NULL。
两者区别:
⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是取字节运算符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
⒋数组做sizeof的参数不退化,传递给strlen就退化为指针了。
⒌大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因
char str[20]=”0123456789”;
long a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
⒏当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
⒐数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。
数组的运算
int a[] = {6,7, 9, 5,4};
printf("%p\n", a); //输出数组a的地址,即数组首元素的地址
printf("%p\n", &a); //输出数组a的地址,即数组首元素的地址
printf("%d\n",sizeof(a+0)); //4 数组的首元素地址
printf("%d\n",sizeof(&a[0])); //4 数组a首个元素的地址
printf("%d\n",sizeof(&a)); //4 数组a首元素的地址
printf("%d\n", sizeof(*a)); //4 计算数组a第一个元素的大小
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)); //20 整个数组的大小
printf("%d\n",sizeof(a)); //20 整个数组的大小
printf("%d\n",sizeof(*&a)); //20 整个数组的大小
printf("%p\n", a+1); //数组下一个元素的地址。
printf("%d\n",sizeof(&a+1));//4 数组a第二个元素的地址
printf("%d\n",sizeof(&a[0]+1));//4 数组a第一个元素的地址+1,还是地址
printf("%p\n", &a+1); //输出跳过整个数组a之后的地址
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 整个字符串大小 多了\0
printf("%d\n", sizeof(arr+0));// 4第一个元素a的地址大小
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));// 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
printf("%d\n", sizeof(&arr[0]+1));// 4第二个元素b地址的大小
char arr[] = "abcdef";
printf("%d\n", strlen(arr)); // 6 整个字符串长度不包括\0
printf("%d\n", strlen(arr+0)); // 6 整个字符串长的
printf("%d\n", strlen(*arr)); // err 崩溃
printf("%d\n", strlen(arr[1])); //err 崩溃
printf("%d\n", strlen(&arr)); // 6 字符串长度
printf("%d\n", strlen(&arr+1)); //x 随机值偏移了整个数组大小 不知何时遇到\0停止
printf("%d\n", strlen(&arr[0]+1)); // 5 第二个元素开始字符串长度
char *p = "abcdef";
printf("%d\n", strlen(p));//6 p相当于arr,代表首元素地址
printf("%d\n", strlen(p+1));//5 第二个元素开始
printf("%d\n", strlen(*p));//err 把a的ascii值当做地址查找无法访问,出错
printf("%d\n", strlen(p[0]));//err 把a的ascii值当做地址查找无法访问,出错
printf("%d\n", strlen(&p));//X 从a当中的地址开始查字符,不知道是否为0停止
printf("%d\n", strlen(&p+1));// 从b当中的地址开始查,不知道是否为0停止
printf("%d\n", strlen(&p[0]+1));//5 从第二个元素开始查找字符,知道'\0'停止
printf("%d\n", sizeof(p));//4 整个字符串地址大小
printf("%d\n", sizeof(p+1));//4 第二个元素地址的大小
printf("%d\n", sizeof(*p));//1 第一个元素a大小
printf("%d\n", sizeof(p[0]));//1第一个元素a大小
printf("%d\n", sizeof(&p));//4 第一个元素地址的大小
printf("%d\n", sizeof(&p+1));//4 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
printf("%d\n", sizeof(&p[0]+1));//4 第二个元素大小