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

来源:互联网 发布:金南俊 和王嘉尔 知乎 编辑:程序博客网 时间:2024/05/18 02:41

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!!!!加油!!!!!!!!


1 0
原创粉丝点击