您好,登錄后才能下訂單哦!
基本的c和c++編程
我將會引導你學習一些簡單的c/c++課程,讓你對它有一個基本的了解。Objective-C和c/c++有很多共同點,所以在本章你不需要學習很多新的概念。理解c/c++同樣能夠幫助你更好的編寫Objective-C,因為Objective-C是C的一個超集。
c編程
c++同樣是c的超集,所以你必須先學會如何使用c,然后在接下來的部分學習c++。我只會討論使用c編程和iPhone編程不同的那部分。
基本數據類型和函數
c的數據類型很少:integer,floating point,double precision floating point 和characters。在不同的操作系統中,每一種數據類型的二進制位是不同的,甚至在iOS的不同版本中也不同。下面的是每種數據類型的取值范圍,但是你不應該太過依賴于這些信息,尤其是在做重要決定的時候:
char:-128到127
integer:-32768到+32767
float:3.4 e-38 到 3.4 e+38
double:1.7 e -308 到 1.7 e +308
還有很多修飾符可以應用帶這些基本類型上;例如,short和long可以用在integer上。
short int sh;
long int counterLong;
使用這些修飾符的目的是為integer提供一個更小或更大的范圍;例如,short是16位,long是32位。iOS編譯器能確保short不比int長,long不比int短。
你也可以使用signed和unsigned修飾符。如果你沒有指定任何signed或unsigned,編譯器默認使用signed。使用unsigned修飾符,能讓數據范圍擴大一倍。例如,integer的范圍從0到65535.
通常你只需使用integer。如果你想存儲一個很大的integer,就添加long修飾符。使用short覆蓋int,內存優化非常小,你基本上可以忽略它。
注意:如果你使用Objective-C,你應該使用NSInteger,NSUInteger,和CGFloat。這些是蘋果內置的包裝類,它們封裝了底層的實際數據結構。 |
c沒有Boolean數據類型,但是Objective-C有。在c中,如果一個Boolean語句返回true,值是1;否則是0.例如 2==2將返回1,而 2==3將返回0。為了增強代碼的可讀性,你可能需要定義兩個Boolean宏,類似這樣:
#define TRUE 1
#define FALSE 0
int t = (1 == 1);
if (t == TRUE) {
// do your work here
}
盡管c函數和Objective-C函數看起來不同,但是你依然需要返回一個值和接收參數。下面是兩個c函數的例子:
int pi_value() {
return 3.14;
}
int add_number(int n1, int n2) {
return n1 + n2;
}
指針
指針在c編程中是非常重要的。在Objective-C中,你通常會看到Objective-C有同樣的指針概念和語法,例如NSMutableArray *myArray = [NSMUtableArray array]。但是,你不需要知道底層內存的細節,因為在Objective-C中指針可以很簡單的認為它是一個對象。但是,如果使用c,你要做的事情將更多,c中指針的概念也更加復雜。
內存指針概念
主存可以看做是一個cell的數組,每一個cell看做是一個字節,每一個數據item存儲在cells的group中。一個char存儲在一個cell,一個integer存儲在兩個cell中,而一個long存儲在4個cell中。每一個cell都可以被數字化,因此每一個變量將有一個內存地址來存儲數據。
圖 9-1 內存指針概念
指針是一個變量,它保存了另一個變量的內存地址。例如,圖9-1變量p里面的數據保存了變量c的內存地址。所以我們說,p指向了c,你可以用語句 p = &c 來表示它;&操作符返回變量c的內存地址,然后賦值給p。&只能應用在內存中的變量,數組和對象,不能用在表達式或常量上。指針的另一個操作符是*;當它應用到指針,指針操作符然后給定地址內存中的內容。這個過程通常稱為解引用。這邊有一個源代碼顯示了是如何進行工作的:
int x = 1, y = 2, a[3];
int *ip; // ip is a pointer that can only point to integer
ip = &x; // ip now points to x
y = *ip; // y is now 1, because you return the data pointed by ip*ip = 0; // x is now 0, I set the data pointed by p to be 0
ip = &a[0]; // ip now points to the first element of array a
值傳遞和引用傳遞
在c編程中,你參數傳遞有兩種方式:值傳遞和引用傳遞。通過值傳遞把參數傳遞給函數是通常的方式。
int add(int t1, int t2) {
return t1 + t2;
}
然而,值傳遞是不起作用的,如果你想要交換兩個變量的值:
void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
int main() {
int x = 3, y = 4;
swap (x, y);
}
問題是在函數返回后,里面的兩個變量值并沒有交換。當swap方法被調用的時候,x和y的值會被拷貝然后再傳遞給函數swap(3, 4)。因此,原始的變量值并沒有改變。
如果你想要改變存儲在變量x和y的內部值,你需要使用引用傳遞。通過引用傳遞,x和y的內存地址被傳遞進來。使用x和y的內存地址,你能夠非常簡單的修改存儲在她們內存的值了。
void swap(int *px, int *py) {
int temp;
temp = *px; // temporarily store the value inside the memory of x
*px = *py; // set the value inside the memory of x.
*py = temp; // set the value inside the memory of y.
}
int main() {
int x = 3, y = 4;
swap (&x, &y);
}
圖 9-2 能夠讓你更好的理解這個過程。
高級數據類型
在c中還有一些高級數據類型:array(數組),string(字符串)和struct(結構體)。這些在Objective-C中都是支持的,但是你應該謹慎的使用,因為會使得代碼難以理解,后續維護也變得更加困難。所有這些數據結構在Objective-C中都有對應的包裝類,使得代碼更加面向對象。但是,在很多情況下,你仍然需要使用c數據結構來提升性能或處理來自c/c++庫的調用結果。
Array數組
在Objective-C中,你通常會使用NSArray或NSMutableArray對象來表示一個數組。但是,在c中,你沒有這些概念,因此你應該集中在數組的基本概念上。在c中為了定義一個數組,你需要提前知道數組的長度,類似這樣的定義:
int a [10]; // an array with maximum ten elements
a[0], a[1], a[2] ... a[9] is the first, second ... tenth elements of the array
指針和數組有非常密切的關系。
int *pa;
pa = &a[0];
這個指針賦值代碼將pa指向數組的第一個元素。根據指針那部分解釋的,賦值語句 x = *pa,x包含了a[0]的值。
你可以通過簡單的算術運算來移動指針指向數組內的不同元素,pa+1會返回下一個元素的地址,pa-1返回上一個元素的地址。圖9-3展示了指針在數組內部的算術運算。
這些計算并不依賴于數組內存變量的類似或大小。因此,(pa + i)將返回數組中的第i個元素的地址。另一個在數組和指針之間非常重要的關系是你可以使用 *(aa + i)來引用a[i]。
在數組和指針之間有一個不同點:指針是一個變量,所以pa = a和pa++都是合法的。然而,a = pa和a++是不合法的。
String字符串
在c中字符串常量,例如 "I am Khang",一個以'\0'結尾的字符數組,這樣程序就能夠找到數組的結束部分。因為string是一個字符數組,你可以簡單的將它賦值給指針。
char *pmessage;
pmessage = "I am Khang";
你可以把string看做是一個正常的數組或指針那樣進行操作,如下面的源代碼:
void my_string_copy (char *s, char *t) {
while (*s++ = *t++) ;
}
my_string_copy函數是非常簡單的;它有兩個字符指針,將string t(通過字符指針來表示)中的字符元素賦值給賦值給string s。
注意:當你把數組作為一個參數傳遞給函數時,c會自動的將它轉換為指向數組的指針。 |
這里有另一個例子,使用了字符數組,但是并沒有使用指針,它展示了數組和指針的內部轉換:
int my_string_length(char *s) {
int i = 0;
while (s[i] != '\0') {
i++;
}
return i;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。