OC基礎10:基本的C語言特性1

1、  函數和方法的區別?

(1)、方法包含在類內部,而函數不用包含在類裏面;

(2)、方法就是函數的一種。

 

2、數組中某個元素的讀法,比如grades [5]讀作“grades sub 5”。

 

3、關於C語言的數組元素的初始化:

  (1)、直接列出所有元素的值,比如:

      int integer[5] = {1, 2, 3, 4, 5};

      char letters[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};

  (2)、如果只指定了較少的初始化值,那麼只會初始化等量的元素,比如:

      float s_data[500] = {100.0, 143.00, 45.50};

      那麼數組中的前三個元素會被初始化成100.0, 143.00, 45.50,其他元素被設爲0;

  (3)、可以直接指定某個元素的值,比如:

      int x = 1233;

      int a[] = {[9]=x+1, [2]=3};

      在這個例子中,直接指定了編號爲9的元素的值爲1234,指定了編號爲2的值爲3。同時這個數組沒有指定大小,編譯器會根據數組內容裏出現了[9]將數組的大小定爲10。

 

4、關於C語言的字符數組:

   如果有一個字符數組定義如下:

  char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘!’, ‘\0’};

   這個數組的大小會自動被定爲7,‘\0’是終止空字符,有了這個符號之後,可以使用NSLog方法打印這個數組,打印成字符串的格式,語句如下:

  NSLog(@’%s’, word);

   ’%s’表示NSLog會持續地顯示字符,直到遇見‘\0’才終止。而後面要打印的內容只需要寫上數組的名稱,不需要方括號

 

5、關於C語言的多維數組:

  (1)、多維數組的聲明方法如下:

      int M[4][5];

       這個語句定義了一個4行5列總共20個元素的多維數組,每一個元素都包含一個整型值;

  (2)、多維數組的初始化可以直接列出數組的所有元素:

      int M[2][4] = {

        {10,5,6,3},

        {34,23,1,20}

}

      這裏需要注意,除了最後一行,每一行結束都要使用逗號分開

  (3)、如果要列出數組所有元素的方法來初始化多維數組,其實可以不用花括號:

      int M[2][4] = {10,5,6,3,34,23,1,20}

      編譯器會自動匹配;

  (4)、也可以不用初始化整個多維數組:

      int M[2][4]{

        {1,2},

        {3,4}

      }

      這樣會初始化每行的前兩個元素,其餘值都會被設爲0。這種情況下一定要使用內層花括號。

 

6、如果沒有聲明函數的返回類型,編譯器會假設返回類型爲整型;如果方法沒有指定返回類型,編譯器會假設返回類型爲id類型

 

7、如果函數的參數數目不確定,那麼可以使用省略號來做形參,比如:

  void NSLog(NSString *format, ...);

   那麼在參數NSString *format後面,就可以是任意數目的附加參數。注意省略號只有三個點。

   這裏指的是NSLog函數的定義,NSLog函數確實是參數數目不確定的,有時輸出一個值,有時輸出多個值。

 

8、靜態函數:

默認情況下,函數是外部的。即是所有和該函數鏈接在一起的文件中的所有函數和方法都可以調用這個函數。如果使用static關鍵字將其定義爲靜態函數,可以限制它的作用域:

  static int gcd(int u, int v){

    ...

   }

   靜態函數則只有和這個函數在同一個文件的函數或者方法可以訪問它。

 

9、如果要向某個函數傳遞數組裏的第i個元素作爲參數,那麼直接使用以下方式即可:

  fx( xArray[i] )

   如果要傳遞整個數組作爲參數,那麼只需要在調用寫出數組的名稱,不需要任何下標

  fx( xArray )

 

10、如果在函數或方法中改變了作爲參數的數組元素的值,那麼這個變化會確實地影響到這個數組本身,不論函數或方法是否已調用完成。因爲函數或方法使用數組做參數時,傳遞給形參的並不是整個數組本身,而是傳遞一個指針,它指向數組所在的地址。所以對形參所做的更改其實都是指向原始數組本身的修改。

 

11、塊的基本模板:

void (^callName) (int) = ^(int n) {

  NSLog(@”%i”,n);

};

需要注意的地方如下:

(1)、第一個void是這個塊的返回類型;

(2)、callName是這個塊賦給的變量名稱,在定義了這個塊之後,使用callName(2);這樣的格式就可以調用這個塊;

(3)、等號前的(int)是這個塊的參數列表,等號後的(int n)是形參,同時形參也有“^”這個符號;

(4)、塊的最後要以分號結尾。

(5)、調用(^callName)的語句應該是:“callName();”,注意是有括號的。

 

12、塊定義在函數或者方法內部,能夠訪問在函數或方法塊之的任何變量。塊能夠訪問但是不能改變這些變量的值,除非使用在塊前面含有兩個下劃線的塊修改器。

 

13、塊能夠作爲參數傳遞給方法或函數。

 

14、一個例子:

#import<Foundation/Foundation.h>

int main(intargc, char *argv[]) {

  autoreleasepool {

    int foo = 10;

    void (^printFoo) (void) = ^(void){

      NSLog(@”Foo is %i”, foo);

    };

    foo = 15;

    printFoo();

}

return 0;

}

這個例子的輸出結果是foo=10。首先把foo賦值爲10,然後定義了塊(^printFoo),最後再把foo賦值爲15。這時候調用(^printFoo),發現出來的結果foo還是10。

說明塊內包含的變量的值在塊定義的時候就確定了,塊在使用到塊外部的變量的時候會將變量複製一份來使用,所以在定義完塊後再去變動變量的值不會影響到塊內的變量的值。一般來說,在塊內部不允許修改變量的值,編譯器會報錯。

 

15、一個例子:

#import<Foundation/Foundation.h>

int main(intarvc, char *arvg[]){

  autoreleasepool{

    __blockint foo = 10;    //此處爲(1)

    void (^printFoo) (void) = ^(void){

      NSLog(@”foo = %i”, foo);

      foo = 20;            //此處爲(2)

    }

    foo = 15;

    printFoo();

    NSLog(@”foo = %i”, foo);

  }

  return 0;

}

首先這個例子如果在(1)這個地方不插入“__block”的話,那麼在(2)這個地方就會報錯,因爲在塊內部不允許修改變量的值,如果要修改的話必須在定義這個變量的時候使用在塊前面含有兩個下劃線的塊修改器。

這個例子的輸出結果是:

foo = 15

foo = 20

由於定義了“__block”,那麼foo的值的修改就會影響到塊了。首先定義foo的值爲10,程序經過塊的時候,foo被修改爲20,然後在塊完結之後,foo被指定爲了15。這時候調用printFoo,出來的值就是foo=15,同時在打印爲foo=15之後,快內部的代碼繼續走下去,把foo置爲了20。最後使用NSLog函數打印出來的就是foo=20了。

另外需要注意,“__block”是由兩個下劃線和block組成的,它們之間沒有空格

 

16、一個簡單的結構

struct date{

  int month;

  int day;

  int year;

};

關於這個結構:

(1)、定義結構必須以分號結尾;(和塊一樣)

(2)、這個結構的類型是“struct date”而不是“date”,應該這樣聲明這個類型的變量:

    structdate today;

(3)、設置或讀取today裏面的day的值爲1的話,要使用點運算符:

    today.day = 1;

 

17、結構的初始化方式:

(1)、直接列出所有元素的值:

    struct date today = {2, 1, 2015};

(2)、使用點運算符可以任意順序或者部分賦值來初始化:

    struct date today = { .year=2015, .month=2};

 

18、可以使用typedef來使結構的類型名稱更簡略,比如定義了某個結構類型struct CGPoint,那麼可以:

typedef structCGPoint CGPoint;

即是用CGPoint來替代struct CGPoint,那麼定義結構的時候就可以用以下語句:

CGPoint myPoint;

這裏要注意,在聲明結構的時候不需要使用*號;在聲明對象的時候(比如Fraction *frac)才需要用到*號。聲明瞭結構之後,就可以使用點運算符來操作結構內部的元素了。

   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章