@[toc]

sizeof操作符

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

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

这个是为什么呢?

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

基本用法

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

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

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

image-20211128083731484

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

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

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

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]的形式更好

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

image-20211128084631655


sizeof和函数传参

先来看看下面这个代码

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括号里的表达式没有真正地运算?

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指出!万分感谢!

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