C语言——如何深刻理解C语言数组名、sizeof、strlen

由于指针的访问可以通过*和[]实现,以及在不同条件下数组名代表的意义不同,加上对于sizeof、strlen的用法理解不够透彻,初学者在使用的时候容易错误使用指针,并且难以发现错误。本文将结合大量例子,讲解数组名、指针加减整数后指向位置、sizeof和strlen的用法。

关于sizeof

sizeof后的内容不会真的计算,sizeof的结果在编译阶段就已经得出

#include<stdio.h>
int main()
{
   
	char a = 1;
	printf("%d\n", a);
	int b = sizeof(a);
	printf("%d\n", b);
	int c = sizeof(a++);//为什么c不是4?//a++并没有真的计算
	printf("%d\n", a);
	printf("%d\n", c);
	int d = sizeof(++a);
	printf("%d\n", d);
	int e = sizeof(-a);//这里发生了整形提升
	printf("%d\n", e);

	int i = 1;
	short j = 2;
	printf("%d\n", sizeof(i = i + j));//4
	printf("%d\n", sizeof(j = j + i));//2
	return 0;
}

我们知道,赋值表达式的值是赋值之后,被赋值给变量的那个值就是该表达式的值。操作符sizeof求得是变量或类型所占内存空间得大小。
在上面的代码中,a的类型是char,故b得值是1;
表达式a++和++a的实质都是把a+1的值赋值给a,已经完成了赋值操作,a的大小还是1字节,故c和d的值都是1;
需要注意的是,a++和++a这两个表达式并没有真的在程序中计算,sizeof在编译期间就算出了a++和++a的值,故打印出来a的值还是1而不是2;
然而,对于大小小于int的类型,在表达式中会进行整型提升,所以e的值是4
对于i和j,sizeof括号里面都是表达式,i=i+j的值就是i的值,而i是int型的,故sizeof得到的结果是4;j是short型的,故sizeof(j=j+i)的值是2

知识要点

数组名

通常我们都不加思考的认为,数组名就是首元素的地址,和指针没有区别,然而实际上,数组名在不同的情境下具有不同的意义,包含它的表达式也会产生意想不到的效果。
以下是对数组名用法的总结

  1. sizeof(数组名),此时数组名表示整个数组,sizeof计算的是整个数组的大小
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址(表现在加减整数上)
  3. 除以上两种情况之外的数组名都表示整个首元素地址

指针类型

指针类型的意义,一是解引用是能访问的字节大小;二是指针加减整数时,指针指向位置跳过的字节数

sizeof与一维数组

#include<stdio.h>
int main()
{
   
	int a[] = {
    1,2,3,4 };//默认在32位平台下,单位为字节
	printf("%d\n", sizeof(a));//16,这里a表示整个数组,4*4=16
	printf("%d\n", sizeof(a + 0));//这里的a表示首元素地址,计算的是一个地址的大小,为4
	printf("%d\n", sizeof(*a));//*a得到的是第一个元素,该元素为int型,大小为4
	printf("%d\n", sizeof(a + 1));//a+1表示第二个元素的地址,地址大小为4
	printf("%d\n", sizeof(a[1]));//第二个元素,int型,为4
	printf("%d\n", sizeof(
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值