个人学习笔记,部分摘抄,不作他用
sizeof
作为一个运算符,在头文件中typedef为unsigned int,其值在编译时就计算好了,参数可以是数组,指针,类型,对象,函数等。编译时候计算的是类型所占空间的字节数,所以数组名做参数时结果会是整个数组的大小。
基础知识:
int array1[]={1,2,3};
int array2[]=“abcde”
int array3[]={‘a’,‘b’,‘c’,‘d’,‘e’}
sizeof(bool):1
sizeof(BOOL):4(相当于int类型)
sizeof(int)->4
sizeof(long):4or 8
sizeof(long long)/sizeof(_int64):8
sizeof(float):4
sizeof(double):8
sizeof(char) ->1
sizeof(wchar_t):windows2 ;linux/ios 4
sizeof(array1) ->12
sizeof(array2)->6(字符串数组,以’\0’结尾)
sizeof(array3)->5
sizeof§:4or8 win32:4;win64:8
注:如果是通过函数传递过来的地址,那么sizeof会把数组首地址和指针无差别当成是地址。
char a[10];
char *b;
int *p=new int[10];
sizeof(a)=>10;(一个char占一个字节)
test_sizeof_array(a)=>4
sizeof§=>4;
sizeof的主要用途
1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:
void * memset(void * s,int c,sizeof(s))
结构体对齐
自然对齐的对齐规则:(CPU在一个时钟周期内存取数据,效率高)
(1)数据成员对齐规则:
在默认情况下,各类成员变量存放的起始地址相对于结构的起始地址的偏移量sizeof(基本类型)或其倍数。如果该成员为非基本成员,则其为子成员中最大的基本类型的整数倍。
(2)整体对应规则:
结构的总大小也有约束条件:最大sizeof(基本类型)的整数倍
typedef struct_a
{
char c1;
long i;
char c2;
double f;
}a;
sizeof(a):24 =1+4+1+8=>(1+3)+4+(4+4)+8
typedef struct_b
{
char c1;
char c2;
long i;
double f;
}b;
sizeof(b):16=1+1+4+8=>(1+!+2)+4+8
strlen
strlen 是一个函数,在运行时候才能计算。参数必须是字符指针。当数组名作为参数传入时,实际上数组就退化为指针了。它可以返回字符串的长度,该字符串可能是自己定义的,也可能是内存中随机的,该行实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL。
简单地说,strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值。
char a[20]={0};
char b[20]={‘w’,‘a’,‘s’,‘d’,‘\0’};
char c[20]="在吗”;
strlen(a)=>0
strlen(b)=>4
strlen(c)=>4(一个汉字两个字节)