sizeof关键字的讲解和深入理解

1.sizeof

(1)结果的单位为字节;

(2)计算类型的大小;

        写法:sizeof(int),其中括号不能省略;

(3)也可以计算变量所占内存的大小;

         写法:int i;

                    sizeof(i);

        其中括号可以省略;但为了好记,不出错,我们不论是求类型还是变量都写上括号;

(4)sizeof一般情况是在编译时求值;所以sizeof(i++)不会引起副作用;由sizeof(i++)和sizeof(i)结果一样;所以没有必要且不允许写这样的代码,同时sizeof(i=1234)这样的代码也不允许写,应为i的值仍为0,并没有被值1234;

总结一下就是:sizeof操作符里面不要有其他运算,否则不会达到预期的目的;

(4)sizeof在求字符串数组,整型数组,指针的时候大小的计算;

接下来看三个例子:

1.

#include<stdio.h>
int main()
{
	int a[]={1,2,3,4};
	printf("%d\n",sizeof(a));
	printf("%d\n",sizeof(a+0));
	printf("%d\n",sizeof(*a));
	printf("%d\n",sizeof(a+1));
	printf("%d\n",sizeof(a[1]));
	printf("%d\n",sizeof(&a));
	printf("%d\n",sizeof(&a+1));
	printf("%d\n",sizeof(&a[0]));
	printf("%d\n",sizeof(&a[0]+1));
	printf("%d\n",sizeof(*&a));
}j

结果:


分析:

首先,先首几个重要的知识;

a.一个指针(或地址)的大小都是四个字节;

b.sizeof求取一个变量类型所占空间的大小,单位字节;

c.数组名在sizeof和取地址&时不发生降级表示整个数组;

d.&a表示取整个数组的地址,给它加1,跳过整个数组;

a表示数组首元素的地址,加1指向下一个元素;

然后再看分析:

#include<stdio.h>
int main()
{
	int a[]={1,2,3,4};           
	printf("%d\n",sizeof(a));//此处的a不降级;表示整个数组;所以此处是求取整个数组的大小为16;
	printf("%d\n",sizeof(a+0));//a为数组首元素的地址,加0,也是首元素地址,所以是求第一个元素地址的大小为4;
	printf("%d\n",sizeof(*a));//a为数组首元素的地址,解引用得到第一个元素,所以此处是求第一个元素的大小为4;
	printf("%d\n",sizeof(a+1));//求第二个元素地址的大小,为4;
	printf("%d\n",sizeof(a[1]));//求第二个元素的大小,为4;
	printf("%d\n",sizeof(&a));//此处a不降级,所以是求整个数组的地址大小,为4;
	printf("%d\n",sizeof(&a+1));// 求整个数组后面紧跟着的元素的地址大小,为4;
	printf("%d\n",sizeof(&a[0]));//第一个元素的地址的大小,为4;
	printf("%d\n",sizeof(&a[0]+1));//第二个元素的地址的大小,为4;
	printf("%d\n",sizeof(*&a));//收下&a表示取整个数组的地址,解引用得到全体数组元素,求全体数组元素的大小,为16;
}
2.
#include<stdio.h>
int main()
{
	char a[]={"abcdef"};           
	printf("%d\n",sizeof(a[0]));
	printf("%d\n",sizeof(&a));
	printf("%d\n",sizeof(*a));
	printf("%d\n",sizeof(&a+1));
	printf("%d\n",sizeof(a+1));
	printf("%d\n",sizeof(a));
	printf("%d\n",strlen(a));
	printf("%d\n",strlen(&a));
	printf("%d\n",strlen(&a+1));
	printf("%d\n",strlen(a+1));
	return 0;
}
分析:首先先来简单讲一下strlen()函数;

 

strlen(C语言函数)

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。头文件为<string.h>

结果:


分析:

#include<stdio.h>
int main()
{
char a[]={"abcdef"};           
printf("%d\n",sizeof(a[0]));//求字符串中第一个字符的大大小,为1;
printf("%d\n",sizeof(&a));//此时a不降级;求整个数组的地址的大小,为4;
printf("%d\n",sizeof(*a));//a表示数组首元素的地址,故求第一个元素的大小,为1;
printf("%d\n",sizeof(&a+1));//求整个数组后面紧挨着的元素的地址大小,为4;
printf("%d\n",sizeof(a+1));//第二个元素地址的大小,为4;
printf("%d\n",sizeof(a));//此时,a不降级,代表一个数组,求整个数组的大小,为7;
printf("%d\n",strlen(a));//a表示数组首元素的地址;从首元素开始统计字符的个数,为abc                         //def共6个;
printf("%d\n",strlen(&a));//此时a不降级,表示整个数组的地址,是从a开始统计,共6个;
printf("%d\n",strlen(&a+1));//此时a不降级,表示整个数组的地址,但加1以后表示整个数                         //组后面紧挨着的元素,是一个不确定元素;所以这个数不确定。
printf("%d\n",strlen(a+1));//a表示数组首元素的地址,加1表示第二个元素,所以从第二个                          // 元素开始统计,为5个;
	return 0;
}
3.
#include<stdio.h>
#include<string.h>
int main()
{
	char *a="abcdef";           
	printf("%d\n",sizeof(a[0]));
	printf("%d\n",sizeof(&a));
	printf("%d\n",sizeof(*a));
	printf("%d\n",sizeof(&a+1));
	printf("%d\n",sizeof(a+1));
	printf("%d\n",sizeof(a));
	printf("%d\n",strlen(a));
	printf("%d\n",strlen(&a));
	printf("%d\n",strlen(&a+1));
	printf("%d\n",strlen(a+1));
	return 0;
}
结果:



分析:

#include<stdio.h>
#include<string.h>
int main()
{
	char *a="abcdef";           
	printf("%d\n",sizeof(a[0]));//求第一个字符a的大小,为1;
	printf("%d\n",sizeof(&a));//求指针变量a的地址的大小,为4;
	printf("%d\n",sizeof(*a));//a为一个char*的指针;对其解引用最多只能访问第一个字符,所以为求一个字符的大小为1;
	printf("%d\n",sizeof(&a+1));//a为一个char*的指针变量;对其取地址,取出的是这个变量的地址; 加1后得到的是这个变量紧按着后面的元素的地址,求其大小,为4;
	printf("%d\n",sizeof(a+1));//a里面存放的字符a的地址,加1,就是b的地址,求地址的大小,为4;
	printf("%d\n",sizeof(a));//a为一个指针变量的名字,里面保存一个地址;求一个指针的大小;为4;
	printf("%d\n",strlen(a));//a里面保存字符a的地址;从字符a向后统计,共有abcdef6个字符,为6; 
	printf("%d\n",strlen(&a));//a为一个指针变量;取地址a取出来的是变量a的地址,从这个地址向后统计,a的里面保存地是字符a的地址;它是怎么排列的没人知道;还有他保存地大小端问题;所以这是个不确定值;
	printf("%d\n",strlen(&a+1));//从a内存的后面紧挨的地址开始统计非'\0'字符,为不确定值;
	printf("%d\n",strlen(a+1));//a里面存第一个字符的地址,加1为第二个字符的地址,从此处开始统计,共有bcdef共5个字符,为5;
	return 0;
}

ok!!!!加油!!!!!!!!


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值