C语言学习之sizeof运算符与strlen函数

个人学习笔记,部分摘抄,不作他用

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(一个汉字两个字节)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值