目录
sizeof
介绍
用法
语法
sizeof(指针类型)
sizeof(*指针)
求数组的大小
求表达式的大小
sizeof和strlen区别
判断字符串长度的其他知识
正文
sizeof
介绍
sizeof是C语言中保留关键字,是求字节运算符,单目运算符。是一个判断数据类型或者表达式长度的运算符。
sizeof(x):求x所占的内存字节数
x可以是一个对象(变量,数组..)都行,也可以是一个类型,x可以不存在,只要typeof(x)确定就可以。
sizeof(x):先求x的类型,然后再求该类型所占的字节数。
1.typeof(x)
2.sizeof(typeof(x))
用法
sizeof (类型说明符)
sizeof 表达式
语法
sizeof有两种语法形式,如下:
sizeof(type_name);//sizeof(类型); sizeof object;//sizeof对象;
因此以下四种情况
int i; sizeof(i);//ok sizeof i;//ok sizeof(int);//ok sizeof int;//error
sizeof(指针类型)
sizeof(指针类型) == 机器字长
机器字长:
eq:32bits机器:机器内部地址线的根数,就是地址的bit位数。
如果机器字长是32bits,在该机器内部所有东西的地址都是32bits.
int *p = NULL; char *p2 = "12345"; printf("sizeof(p)"); typeof(p) = int * sizeof(p) = sizeof(int *) = sizeof(指针) = 4bytes (32bits的机器) printf("sizeof(p2)"); typeof(p2) = char * sizeof(p2) = sizeof(char *) = sizeof(指针) = 4bytes
所以以上两种指针类型的字长都是4字节
int (*p)[4]; //p是一个数组指针 void (*p2)(int, float);//p2 是一个函数指针 sizeof(p):4 sizeof(*p):16 sizeof(p2): 4 sizeof(*p2): 1
不管你是什么类型的指针,你保存的是别的对象的地址,所有对象的地址,在32bits机器上都是32bits(4个字节)
在32bits机器上,所有指针变量占4个字节。
p是一个指针变量
p和*p的区别:
p表示指针变量本身
*p表示指向的对象(的值)。
sizeof(*指针)
int *p = NULL; char *p2 = "12345"; sizeof(*p) = ? typeof(*p): p是一个指针,*p = *地址 ==》地址对应的那个变量 typeof(*p):求p指向的类型 --》int sizeof(int) = 4 sizeof(*p2) = ? typeof(*p2):求p2指向的类型 : char sizeof(*p2) = sizeof(char ) = 1
特别注意多重指针,除了最外层的指针是与他的类型一样外,其他层级的指针都是4字节(32bits机器)
32bits机器 char ***p3; sizeof(p3)= ? //4 p3是一个指针,指向***p3,所以,sizeof(***p3) = 4 sizeof(*p3) = ?//4 *p3是一个指针,指向**p3,所以,sizeof(*p3) = 4 sizeof(**p3) = ?//4 **p3是一个指针,**p3 指向了char *,所以,sizeof(**p3) = 4 sizeof(***p3) = ?//1 p3指向了char,所以sizeof(***p3) = 1
求数组的大小
int a[100];
sizeof(a) = ?
sizeof(元素类型)*元素个数 = sizeof(int) * 100 = 400;
sizeof(a[1024]);// 4
虽然a[1024]不存在,但是类型是确定的。
typeof(a[1024]) = int;
sizeof(int) = 4;
注意作为数组名出现时,当指针用
int main() { int a[3][4]; func_xxx(a,3) } void func_xxx( int a[][4], int n) { sizeof(a) = ?// 4(32bits) 数组名作函数参数,当指针用的。 }
注意区分指针数组与数组指针
int *p[4]; //p是一个指针数组 里面4个元素都是指针。 int (*a)[4];//a是一个数组指针 是一个指针 指向了一个数组 sizeof(p) typeof(p) = int[4] * sizeof(p) = sizeof(int[4] *) * 4 = 4 * 4 = 16 sizeof(a) typeof(a) = int[4]* sizeof(a) = sizeof(int[4] *) = sizeof(指针) = 4
求表达式的大小
sizeof(1) = 4;
因为typeof(1) = int,所以sizeof(1) = sizeof(int) = 4
同理sizeof(1.0) = 8;
sizeof('a') = 1;
sizeof("abcd") = 5; //因为最后还有一个'\0';
sizeof和strlen区别
1.sizeof是一个运算符,strlen是一个函数;
2.sizeof求字节的大小,strlen求字符串的长度。
最常见的区别
sizeof("abcd") = 5; //因为最后还有一个'\0';
strlen("abcd") = 4; //最后的'\0'不计入;
判断字符串长度的其他知识
字符串"!\\\xefgh\12345\bb\nn\"包含多少个字符
用等号分割一下就是!=\\=\xef=g=h=\123=4=5=\b=b=\n=n=\"是13个
"\"遇到x,如果后面接了两个0~9或a~f的字符,则四个看成一个16进制的字符。
"\"遇到0,如果后面接了两个0~7的字符,则看成一个8进制字符,至于为什么"\"遇到0,不按"\0"结束符来算,是因为按最长匹配结果来的