c语言深度剖析之—关键字

C/c++语言中的关键字:

   类1:数据类型关键字

                     Char , int, float, double,long,short,signed, unsigned, enum , struct, union, class, void

   类2:控制语句关键字

                  循环语句: For ,do, while,break,continue  

                 条件语句:if ,else, goto

                 开关语句:swith, case, default,return  

   类3:存储类型关键字

                  auto , register, static, extern,

   类4:其他

                sizeof, typedef,const,volatile

C++中部分的关键字:

   类1: public,  protected, private;


注意:c中的struct没有行为,不可以定义函数,但可以有函数指针;

            c++中的struct可以定义函数,默认为private;

              C++中struct 和class的区别:

           1)默认继承权限:class,private ; struct ,public;

           2)默认成员访问权限:class,private, struct,public;


关于sizeof,请记住:

    计算变量所占的空间时,()可省去,计算类型大小时,()不可省

  sizeof(i)=sizeof i=sizeof(int)=4;

有关sizeof的计算题:更多大小端字节与sizeof()举例见我的博文:

嵌入式linux系统基础与编程笔记汇总

 1.

    void main()

{

    char aa[10];

    printf(“%d”,strlen(aa));

}

注意:

sizeof()与初始化无关,sizeof是关键字(在编译时完成),但strlen()是函数在运行时求值,与初始化有关,不初始化可能导致错误

 

  2.给定结构structA

{

   char t:4;

   char k:4;

   unsigned short i:8;

   unsigned long m;

};问sizeof(A)= ?  8

 

3、设有以下说明和定义:

typedef   union {

     long i;

     int    k[5];

     char c;} DATE;

struct   data {

     int   cat;

     DATE cow;

   double dog;} too;

DATE max;

则语句printf("%d",sizeof(structdate)+sizeof(max));的执行结果是:_____

【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型int[5], 占用20个字节. 所以它的大小是20

data是一个struct, 每个变量分开占用空间. 依次为int4 +

DATE20 + double8 = 32.

所以结果是20 + 32 = 52.


4:

int a[5];

sizeof(a)=sizeof(int) * 5=20;

sizeof(a[10])=4;

取地址:

sizeof(&a[1])=4;

sizeof(&a)=4;

5:

main()
{
Int a[5]={1,2,3,4,5};
int*ptr=(int*)(&a+1);
int* ptr2=(int*)((int*)a+1);
printf(“%d,%d,%d”,*(a+1),*(ptr-1),*ptr2);  结果:2,5,2
}

数组名a作为右值,代表数组首元素地址&a[0];而并不是数组的首地址,尽管两者数值相同;

数组名a不能作为左值,可以访问数组中的某个元素(如a[0],a[1],可以作为左值),但是不能对数组整体访问;

类似++a,不成立。

地址  0-3   4-7   8-11  12-15  16-19   20-23
数值   1     2     3      4      5
&a+1 就是地址为20的地方
*ptr1[-1]就是20-4=16这个地方  一个Int 占用4个地址
(int)a+1 跟(int*)a+1不一样  前者地址为1 后者为4,
所以,int *ptr2=(int*)((int)a+1);*ptr2表示的是指向地址为1的指针地


有关符号的计算:

注意:

1.char在默认情况下位有符号,数值范围是【-128,127】,超出此范围产生溢出,负数以补码的形式存放;

2.溢出时,取低8位;当-255,全0

3.strlen(),计算字符串长度不包括最后的’\0’;

追问三个问题:

       1.   0与-0,在内存如何存放?

       0与整数都以原码存储,并不存在-0的补码的说法;

       2.   int i=-20;unsigned int j=20;

      i+j= 32808

      有符号数与无符号数相加时,都转为无符号数

      3. unsigned i ;

             for(i=9;i>=0;i--)

          {     printf("%u\n",i);   }

      答:无限循环中~~

分析struct ,class, union

Struct成员默认是public;class成员默认是private;

在union中成员默认是public,所有的数据成员共享一个空间,同一时间只能存放其中一个数据,

所有的数据成员拥有相同的起始地址;主要用来压缩空间,存放不会在同一时间同时用到数据;

大小端字节对于union的影响:

例:


在小端字节序中;u.i=0x3839;

在大端字节序中:u.i=0x3938;

在栈中数据存放从高地址向低地址;

对联合体任何数据的访问都是从首地址开始的;

                                                    fmoonstar 更新至2011.11.25



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值