參考:http://www.cnblogs.com/duchengdong/archive/2012/03/30/2425300.html
1、
main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }
答案:2、5
分析:*(a+1)即a[1],為2;&a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)
int *ptr=(int *)(&a+1);
則ptr實際是&(a[5]),也就是a+5
2、用預處理指令#define聲明一個常數,用以表明一年都多少秒(忽略閏年的情況)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
#define的基本語法知識(不能以分號結尾、括號的使用等)
懂得預處理器將為你計算常數表達式的值
意識到這個表達式將使一個16位機的整型數據溢出,因此要使用到長整型符號L,告訴編譯器這個常數為長整型數
如果在表達式中用到了UL(表示無符號整型)
3、寫一個標准的宏MIN,這個宏輸入兩個參數並返回較小的一個
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
4、寫一個NSString類的實現
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id) stringWithCString: (const char*)nullTerminatedCString encoding: (NSStringEncoding)encoding { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; return AUTORELEASE(obj); }
5、obj-c有多重繼承嗎?不是的話有什么替代方法?
沒有,多繼承在cocoa中使用protocol委托來實現
6、obj-c有私有方法嗎?是有變量呢?
方法只有兩種:靜態方法和實例方法,默認為公有。
變量:私有、保護和公有。默認為私有。
@interface Controller : NSObject { NSString *something; } + (void)thisIsAStaticMethod; - (void)thisIsAnInstanceMethod; @end @interface Controller (private) - (void)thisIsAPrivateMethod; @end
可以通過上述方法來實現方法的私有化
7、關鍵字const有什么含意?修飾類呢?static的作用?用於類呢?還有extern C的作用
- const意味着只讀
const int a; a為一個常整型數
int const a; 同上,a為一個常整型數
const int *a; a為指向常整型數的指針(即整型數不可修改,但是指針可以)
int* const a; a為指向整型數的常指針(即整型數可以修改,但是指針不可修改)
int const *a const; a為一個指向常整數的常指針
- static關鍵字作用
(1)函數體內 static 變量的作用范圍為該函數體,不同於 auto 變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;
(2)在模塊內的 static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內;
(4)在類中的 static 成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,因而只能訪問類的static 成員變量。
- extern "C"的作用
(1)被 extern "C"限定的函數或變量是 extern 類型的;
extern 是 C/C++語言中表明函數和全局變量作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器,
其聲明的函數和變量可以在本模塊或其它模塊中使用。
(2)被 extern "C"修飾的變量和函數是按照 C 語言方式編譯和連接的;
- extern "C"的慣用法
行下列處理:
extern "C"
{
#include "cExample.h"
}
而在 C 語言的頭文件中,對其外部函數只能指定為 extern 類型,C 語言中不支持 extern "C"聲明,
在.c 文件中包含了 extern "C"時會出現編譯語法錯誤。
能直接引用聲明了 extern "C"的該頭文件,應該僅將 C 文件中將 C++中定義的 extern "C"函數聲明為
extern 類型。
8、框架分類
- 音頻和視頻
Core Audio
OpenAL
Media Library
AVFoundation
- 數據管理
Core Data
SQLite
- 圖片和動畫
Core Animation
OpenGL ES
Quartz 2D
- 網絡
Bonjour
WebKit
BSD Sockets
- 用戶應用
Address Book
Core Location
Map Kit
Store Kit
9、obj-c的優缺點
obj-c優點:
1)Cateogies
2)Posting
3)動態識別
4)指標計算
5)彈性訊息傳遞
6)不是一個過度復雜的C衍生語言
7)obj-c與c++可混合編程
obj-c缺點:
1)不支持命名空間
2)不支持運算符重載
3)不支持多重繼承
4)使用動態運行時類型,所有方法都是函數調用,所以很多編譯時優化方法都用不到。
10、關鍵字volatile有什么含意?並給出三個不同的例子。
一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確的說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:
1、並行設備的硬件寄存器(如:狀態寄存器)
2、一個中斷服務子程序會訪問到的非自動變量
3、多線程應用中被幾個任務共享的變量
11、簡述堆和棧的區別
棧是編譯器自動管理,堆是程序員控制的。
棧是一塊連續的內存區域,是向低地址擴展的數據結構,堆是向高地址擴展的數據結構,是不連續的用鏈表存儲的。
