上篇博客提到了一个知识点
sizeof操作符括号内的表达式是不会真正计算的
这个是为什么呢?
我们先来看看sizeof的基本用法
基本用法#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
但当我们以这种方式书写的时候,编译器就会报错
printf("%d\n",sizeof int);
- 在使用sizeof的时候,变量a的括号可以省略
- 但直接计算int的时候,括号不能省略
这说明sizeof是一个操作符,而不是函数
int arr[10]={0};
printf("%d\n",sizeof (arr));
printf("%d\n",sizeof (int[10]));
这两句代码打印的都是40,其中int[10]是arr数组的类型
冷知识,我们可以用9[arr]来访问数组元素
但这么做会降低代码的可读性,所以我们还是采取arr[9]的形式更好
int arr[10]={0};
arr[9]=1;
printf("%d\n",9[arr]);
sizeof和函数传参
先来看看下面这个代码
#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位平台,打印结果如下
VS编译器下
x86–32位–int 4
x64–64位–int 8
为什么在main函数里面打印的是40和10
到了函数里面就只有4了呢?
数组传参
数组在传参的时候,传过去的只是首元素的地址
数组名代码数组首元素的地址
问:为什么字符变量只占一个字节,但这里打印的是4呢?
答:这里传入的是char数组的指针,指针变量都是4个字节
siezof和表达式
现在就到我们的重点了
为什么sizeof括号里的表达式没有真正地运算?
short s=5;
int a=10;
printf("%d\n",siezof(s=a+2));
printf("%d\n",s);
这里就牵扯到C语言程序运行的几个步骤了
- 编译–test.c
- 链接
- 运行–test.exe
简单地说,只有在链接之后运行的代码,才会真正给a赋值
而sizeof括号中的语句,是在编译中运行的
程序会先计算这个表达式,推断出它的长度,再返回给printf打印
所以,sizeof括号内的表达式不会真的给S赋值
你明白了吗?
sizeof和strlen的区别
再求字符串的长度的时候,我们可以使用sizeof,也可以使用strlen
这两个的主要区别如下
- sizeof会计算整个数组内字符串的长度,包括字符串暗藏的’\0’
- strlen计算长度的时候,遇到’\0’后停止
在使用的时候,我们需要注意sizeof在计算长度的时候是会比strlen多算一个的
根据具体情况选择sizeof或者strlen
结语这篇博客迟到太久了,最近实在是有点忙
如果有错误,还请各位dalao指出!万分感谢!
高数太难了啊啊啊啊啊!(哭唧唧)