距离上次更新本文已经过去了 729 天,文章部分内容可能已经过时,请注意甄别

@[toc]

sizeof 操作符

上篇博客提到了一个知识点 【链接】

sizeof 操作符括号内的表达式是不会真正计算的

这个是为什么呢?

我们先来看看 sizeof 的基本用法

基本用法

c
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main()
{
int a=10;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(int));

printf("%d\n",sizeof a);
return 0;
}

打印结果为 3 个 4

但当我们以这种方式书写的时候,编译器就会报错

c
1
printf("%d\n",sizeof int);

image-20211128083731484

  • 在使用 sizeof 的时候,变量 a 的括号可以省略

  • 但直接计算 int 的时候,括号不能省略

这说明 sizeof 是一个操作符,而不是函数

c
1
2
3
int arr[10]={0};
printf("%d\n",sizeof (arr));
printf("%d\n",sizeof (int[10]));

这两句代码打印的都是 40,其中 int [10] 是 arr 数组的类型

冷知识,我们可以用 9 [arr] 来访问数组元素

但这么做会降低代码的可读性,所以我们还是采取 arr [9] 的形式更好

c
1
2
3
int arr[10]={0};
arr[9]=1;
printf("%d\n",9[arr]);

image-20211128084631655


sizeof 和函数传参

先来看看下面这个代码

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>

void test1(int arr[])
{
printf("%d\n",sizeof(arr));//4
}
void test2(char ch[])
{
printf("%d\n",sizeof(ch));//4
}
int main()
{
int arr[10]={0};
char ch[10]={0};
printf("%d\n",sizeof(arr));//40
printf("%d\n",sizeof(ch));//10
test1 (arr);
test2 (ch);


return 0;
}

32 位平台,打印结果如下

image-20211128103920879

VS 编译器下

x86–32 位–int 4

x64–64 位–int 8

为什么在 main 函数里面打印的是 40 和 10

到了函数里面就只有 4 了呢?

数组传参

数组在传参的时候,传过去的只是首元素的地址

数组名代码数组首元素的地址

问:为什么字符变量只占一个字节,但这里打印的是 4 呢?

答:这里传入的是 char 数组的指针,指针变量都是 4 个字节


siezof 和表达式

现在就到我们的重点了

为什么 sizeof 括号里的表达式没有真正地运算?

c
1
2
3
4
short s=5;
int a=10;
printf("%d\n",siezof(s=a+2));
printf("%d\n",s);

image-20211129101539106

这里就牵扯到 C 语言程序运行的几个步骤了

  • 编译–test.c
  • 链接
  • 运行–test.exe

简单地说,只有在链接之后运行的代码,才会真正给 a 赋值

而 sizeof 括号中的语句,是在编译中运行的

程序会先计算这个表达式,推断出它的长度,再返回给 printf 打印

所以,sizeof 括号内的表达式不会真的给 S 赋值

你明白了吗?


sizeof 和 strlen 的区别

再求字符串的长度的时候,我们可以使用 sizeof,也可以使用 strlen

这两个的主要区别如下

  • sizeof 会计算整个数组内字符串的长度,包括字符串暗藏的’\0’
  • strlen 计算长度的时候,遇到’\0’后停止

在使用的时候,我们需要注意 sizeof 在计算长度的时候是会比 strlen 多算一个的

根据具体情况选择 sizeof 或者 strlen

image-20211129102722786

结语

这篇博客迟到太久了,最近实在是有点忙

如果有错误,还请各位 dalao 指出!万分感谢!

高数太难了啊啊啊啊啊!(哭唧唧)