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



發佈了65 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章