strlen()和sizeof()的区别

简介: strlen()和sizeof()的区别

1.strlen()是一个函数,sizeof()是操作符

2.strlen()中必须存放地址,若存放的是一个常量,则会报错,其工作原理是从地址开始到'\0'结束,而返回结果不包括’\0’;

sizeof()中可存放如下:

  • 数组:编译时分配的数组空间大小
  • 指针:存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4)
  • 类型:该类型所占的空间大小
  • 对象:对象的实际占用空间大小
  • 函数:函数的返回类型所占的空间大小.函数的返回类型不能是void

3.编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来.并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度.

题目练习+答案:

//一维数组

int a[] = {1,2,3,4};

printf("%d\n",sizeof(a)); ——16

printf("%d\n",sizeof(a+0));——4或8(X86和X64CPU的位数来决定

printf("%d\n",sizeof(*a));——4(int型变量)

printf("%d\n",sizeof(a+1));——4或8

printf("%d\n",sizeof(a[1]));——4

printf("%d\n",sizeof(&a));——4或8

printf("%d\n",sizeof(*&a));——16

printf("%d\n",sizeof(&a+1));——4或8

printf("%d\n",sizeof(&a[0]));——4或8

printf("%d\n",sizeof(&a[0]+1));——4或8

//字符数组

char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr));——6

printf("%d\n", sizeof(arr+0));——4或8

printf("%d\n", sizeof(*arr));——1

printf("%d\n", sizeof(arr[1]));——1

printf("%d\n", sizeof(&arr));——4或8

printf("%d\n", sizeof(&arr+1));——4或8

printf("%d\n", sizeof(&arr[0]+1));——4或8

char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", strlen(arr));——随机

printf("%d\n", strlen(arr+0));——随机

printf("%d\n", strlen(*arr));——err

printf("%d\n", strlen(arr[1]));——err

printf("%d\n", strlen(&arr));——随机

printf("%d\n", strlen(&arr+1));——随机

printf("%d\n", strlen(&arr[0]+1));——随机


char arr[] = "abcdef";

printf("%d\n", sizeof(arr));——7

printf("%d\n", sizeof(arr+0));——4或8

printf("%d\n", sizeof(*arr));——1

printf("%d\n", sizeof(arr[1]));——1

printf("%d\n", sizeof(&arr)); ——4或8

printf("%d\n", sizeof(&arr+1)); ——4或8

printf("%d\n", sizeof(&arr[0]+1)); ——4或8

printf("%d\n", strlen(arr)); ——6

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));——随机

printf("%d\n", strlen(&arr[0]+1));——5

char *p = "abcdef";

printf("%d\n", sizeof(p)); ——4或8

printf("%d\n", sizeof(p+1)); ——4或8

printf("%d\n", sizeof(*p));——1

printf("%d\n", sizeof(p[0]));——1

printf("%d\n", sizeof(&p));——4或8

printf("%d\n", sizeof(&p+1));——4或8

printf("%d\n", sizeof(&p[0]+1));——4或8

printf("%d\n", strlen(p));——6

printf("%d\n", strlen(p+1));——5

 printf("%d\n", strlen(*p));——err

printf("%d\n", strlen(p[0]));——err

printf("%d\n", strlen(&p)); ——随机

printf("%d\n", strlen(&p+1));——随机

 printf("%d\n", strlen(&p[0]+1));——5

//二维数组

int a[3][4] = {0};

printf("%d\n",sizeof(a));——48

printf("%d\n",sizeof(a[0][0]));——4

printf("%d\n",sizeof(a[0]));——16

printf("%d\n",sizeof(a[0]+1));——4/8

printf("%d\n",sizeof(*(a[0]+1)));——4

 printf("%d\n",sizeof(a+1));——4/8

 printf("%d\n",sizeof(*(a+1)));——16

printf("%d\n",sizeof(&a[0]+1));——4/8

printf("%d\n",sizeof(*(&a[0]+1))); ——16

printf("%d\n",sizeof(*a));——16

printf("%d\n",sizeof(a[3]));——16

//a[3]是二维数组的第4行,虽然没有第四行,但是类型能够确定,大小就是确定的。大小就是一行的大小,单位是字节 - 16

// //能够分析出 a[3]的类型是:int [4]

总结:

数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。


目录
相关文章
|
7月前
|
编译器 C语言
sizeof,sizeof与strlen的区别
sizeof,sizeof与strlen的区别
58 0
sizeof,sizeof与strlen的区别
|
6月前
|
C语言
sizeof与strlen的使用及其区别
sizeof与strlen的使用及其区别
sizeof与strlen的使用及其区别
|
2月前
|
编译器 C++
sizeof 和 strlen 的区别
`sizeof` 和 `strlen` 是 C 和 C++ 中常用的运算符/函数,功能和用途不同
68 11
|
2月前
|
C语言
深入解析sizeof和strlen的区别与联系
深入解析sizeof和strlen的区别与联系
strlen和sizeof详解
strlen和sizeof详解
86 0
|
7月前
strlen与sizeof 的基本用法
strlen与sizeof 的基本用法
46 0
|
7月前
|
Serverless
sizeof和strlen的区别【详解】
sizeof和strlen的区别【详解】
57 0
|
C语言
strlen和sizeof的区别
strlen和sizeof的区别
86 0
strlen与sizeof的区别
strlen与sizeof的区别
77 0
sizeof与strlen区别
sizeof是关键字,参数可以是各种数据(包括函数,类型,对象,数组,指针……)用于计算数据所占字节大小 strlen是函数,参数类型必须是字符型指针(char *),用于计算字符串,从字符串的第一个地址开始遍历,直到遇到‘\0’停止
83 0