sizeof与strlen的区别和详解

简介: sizeof与strlen的区别和详解

目录


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"结束符来算,是因为按最长匹配结果来的


相关文章
|
6月前
|
编译器 C语言
sizeof,sizeof与strlen的区别
sizeof,sizeof与strlen的区别
51 0
sizeof,sizeof与strlen的区别
|
5月前
|
C语言
sizeof与strlen的使用及其区别
sizeof与strlen的使用及其区别
sizeof与strlen的使用及其区别
|
1月前
|
编译器 C++
sizeof 和 strlen 的区别
`sizeof` 和 `strlen` 是 C 和 C++ 中常用的运算符/函数,功能和用途不同
60 11
|
1月前
|
C语言
深入解析sizeof和strlen的区别与联系
深入解析sizeof和strlen的区别与联系
|
6月前
|
存储 编译器
strlen()和sizeof()的区别
strlen()和sizeof()的区别
48 0
strlen和sizeof详解
strlen和sizeof详解
84 0
|
6月前
strlen与sizeof 的基本用法
strlen与sizeof 的基本用法
42 0
|
6月前
|
Serverless
sizeof和strlen的区别【详解】
sizeof和strlen的区别【详解】
54 0
|
11月前
|
C语言
strlen和sizeof的区别
strlen和sizeof的区别
85 0
|
11月前
strlen与sizeof的区别
strlen与sizeof的区别
68 0