2010.3.26

1】C語言的邏輯運算符:

     && 邏輯與,|| 邏輯或 ;如 表達式1&&x<表達式2,如果表達式1爲假,則表達式2不會執行;因此在對於會改變變量的表達式中,要注意&&的判斷運行規則。

2】數組:

     總字節數 = sizeof(數據類型)*元素個數

     const int days[] = {31,28,31,30,31,30};

     int index;

     for(intdex=0;index<sizeof days/sizeof days[0];index++)

          printf("Month %2d has %d days/n",index+1,days[index]);

3】多維數組:

     對於多維數組的分析因採用分解的思想。

4】指針:

     px + n       指針向地址大的方向移動n個數據

     n 有多大?取決於px所指向的類型

     px+n表示的實際位置的地址量是:(px)+sizeof(px的類型)*n

5】對於一個數組S[n],&s+1表示什麼意思?s+1表示什麼意思?

     &s+1等價於一個數組指針  int *[]     即&s代表的還是一個地址與s的值是相同的,只不過它所表示的類型變了。

     s+1等價一個指針    int *                    s代表

錯6】對一個數組賦初值,常量(define x 10) char s[x]=“abcd”;可行?變量 int x=1;char s[x]="abcd";非法的?

     這裏就涉及到了一個預處理和編譯類型的問題,跟我們的編譯流程有關。define x 10 在預處理之前定義是常量;int x=1 在預處理之

     後程序運行時加載的,而char s[x]="abcd" 初始化是在預處理的時候進行的,也就是說,當編譯器預處理的時候,要給s[x]指定分配

     一份內存,而x的值還沒有指定,是一個隨即值,因此會產生錯誤。

7】賦初值與預處理的關係?

     比如 int i=10;   將數據10放在一個rodata段裏,當程序加載到vm運行的時候,取出10給i; 

            int i;i=10;

8】指針變量與數組的指針(或叫數組名)存在本質的不同,指針變量是地址變量,而數組的指針(數組名)是地址常量。

9】初學者經常犯的一個毛病!!!

     char *p;

     strcpy(p,"Hello");       p必須先指向一段合法內存。

     解決方法:p=malloc(10) (動態分配);或p=a[10];

10】int **pp;int *p;則**(pp+1)與 *(p+1)有什麼不同?

11】字符指針與字符串

      在程序中,初始化字符指針是把內存中字符串的首地址賦予指針,另外當一個字符指針初始化爲指向一個字符串常量時,不能對字符指

      針變量的目標賦值。

      如:

          1>char *ps="hello";        "hello"是字符串常量,表示只讀字符串。

          2>char str[]="hello";       將hello初始化到str[]中來,str[]是可變的。

          因此,*ps='x'; 對於1>來說是錯誤的。對於2>來說是對的,等價與str[0]='x';

12】const 在c與c++中區別?

       c 中 const定義一個只讀變量;

       c++ 中 const定義一個常量(可以用const替代define);

       在看下面的一些定義:

       const int *p;           p所指向的目標不可變,不能通過*p去修改p所指向的變量,變量本身是可以修改的;如:*p=4錯;x=4對;

                                      我們可以這樣來理解,const修飾int,而下面的const修飾p。int const *p等同於const int *p

       int *const p;           指針本身不可變,只讀的;因此在定義他的時候要對它初始化,否則以後不可變了。

       對於const,給我們帶來了一定安全性的作用;比如:

                                                                             func(const char *s)

                                                                      保證了函數內部不會通過*s改變s所指向的值。

13】函數的參數傳遞:

           函數與函數之間的數組傳遞,複製傳遞方式只是提供一種形式,被調用函數的形參數組的數組名實際上是一個指針變量,因此,複製

      傳遞方式與數組的指針傳遞方式完全相同,只是形參的說明形式不同而已。

       看下面一個例子:

                             void func(char str[])

                             {

                                    printf("%d/r/n",sizeof(str));

                             }

                              int main()

                              {

                                    char str[]="abcdefg";

                                    printf("%d/r/n",sizeof(str));

                                    func(str);

                              }

                     打印的結果是:    8

                                              4

        這就證實了函數參數傳遞的是一個指針,即使是數組,編譯器也會將它當成指針。

        下面看下指針與數組的一些對比:

                                指針                                         數組

                           存放地址                                  存放數據

                           指向匿名內存                             數組名

                           間接訪問                                   直接訪問

                           malloc動態內存                         自動存儲

                           地址變量                                   地址常量

14】數組下標是否可以爲-1?

       答案是肯定的;這裏我們要理清一個思路,數組的下標僅表示偏移量,設數組 double a[i];我們可以通過a[i]取得這個數組中的某個值,其實制是通過*(a+i)取得,因此如果在定義一個函數:   通過func(a)傳遞參數

                                                       func(double b[])

                                                      {

                                                              b++;            此時b指向的是a+1這個地址,即a[1]的值

                                                              b[-1];           此時b[-1]相當與*(b-1),即a[0]的值

                                                       }

15】指針數組與數組指針

        一個數組,若其元素均爲指針類型數據,稱爲指針數組,也就是說,指針數組中每一個元素都相當於一個指針變量。

16】指針函數與函數指針

       函數指針是用來存放函數的地址,這個地址是一個函數的入口地址,而且是函數調用時使用的起始地址。

       如:

           int func(double)                  int (*pf) (double);

           {                                         pf=func;

                                                      pf(double);          此時調用pf就相當與在調用func

           }

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