- 相關(guān)推薦
iPhone軟件開發(fā)面試題
1.根據(jù)程序給出問題答案
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],*(ptr-1)就是a[4],執(zhí)行結(jié)果是2,5
&a 1不是首地址 1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int)int *ptr=(int*)(&a 1);?
則ptr實(shí)際是&(a[5]),也就是a 5。原因如下:&a是數(shù)組指針,其類型為 int (*)[5],而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針 1之后增加的大小不同。是長(zhǎng)度為5的int數(shù)組指針,所以要加 5*sizeof(int),所以ptr實(shí)際是a[5]。但是prt與(&a 1)類型是不一樣的(這點(diǎn)很重要),所以prt-1只會(huì)減去sizeof(int*)。
a,&a的地址是一樣的,但意思不一樣。a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a 1是數(shù)組下一元素的地址,即a[1],&a 1是下一個(gè)對(duì)象的地址,即a[5].
2.以下為Windows NT下的32位C 程序,請(qǐng)計(jì)算sizeof的值??
void Func ( char str[100] ) ?
{ ?
sizeof( str ) =? ?
} ?
void *p = malloc(100 ); ?
sizeof ( p ) = ?
這題很常見了,Func ( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個(gè)指針;在失去其內(nèi)涵的同時(shí),它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺(tái)下,指針的長(zhǎng)度(占用內(nèi)存的大小)為4字節(jié),故sizeof( str ) 、sizeof ( p ) 都為4。
3.還是考指針,不過我對(duì)cocoa的代碼還是不太熟悉
大概是這樣的
- (void)*getNSString(const NSString *inputString)
{
inputString =@"This is a main test\n";
return ;
}
main(void)
{
NSString*a=@"Main";
NSString *aString= [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n", aString);
}
最后問輸出的字符串:NULL,output在函數(shù)返回后,內(nèi)存已經(jīng)被釋放。
4.用預(yù)處理指令#define聲 明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)
#define SECONDS_PER_YEAR (60 * 60 * 24 *365)UL ?
我在這想看到幾件事 情:
#define 語(yǔ)法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等) ?
懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價(jià)的。
意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出-因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。
如果你在你的表達(dá)式中用到UL(表示無(wú)符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。
5.寫一個(gè)"標(biāo)準(zhǔn)"宏MIN ,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。
?#define MIN(A,B) ((A) <= (B) ? (A) : (B))
這個(gè)測(cè)試是為下面的目的而設(shè)的:
標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來說,為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。
三重條件操作符的知識(shí)。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比 if-then-else
更優(yōu)化的代碼,了解這個(gè)用法是很重要的。
懂得在宏中小心地把參數(shù)用括號(hào)括起來
我也用這個(gè)問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?
least = MIN(*p , b);
結(jié)果是:((*p ) <= (b) ? (*p ) : (*p ))這個(gè)表達(dá)式會(huì)產(chǎn)生副作用,指針p會(huì)作三次 自增操作。
6.寫一個(gè)委托的 interface
@protocol MyDelegate;
@interface MyClass: NSObject
{
id delegate;
}
// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
7. 寫一個(gè)NSString類的實(shí)現(xiàn)
(id)initWithCString:(constchar *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
(id) stringWithCString: (constchar*)nullTerminatedCString ? encoding: (NSStringEncoding)encoding?
{?
NSString *obj;
obj= [self allocWithZone: NSDefaultMallocZone()];
obj = [objinitWithCString: nullTerminatedCString encoding: encoding];
returnAUTORELEASE(obj);?
}
8.obj-c有多重繼承么?不是的話有什么替代方法?
?cocoa 中所有的類都是NSObject的子類,多繼承在這里是用protocol委托代理來實(shí)現(xiàn)的。
9.obj- c有私有方法么?私有變量呢
objective-c 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OOP的原則就是一個(gè)對(duì)象只暴露有用的東西. 如果沒有了私有方法的話, 對(duì)于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(gè)私有方法
@interface Controller : NSObject { NSString*something; }
(void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的
10.關(guān)鍵字const有什么含意?修飾類呢?static的作 用,用于類呢?還有extern c的作用
、 const 意味著"只讀",下面的聲明都是什么意思:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就是整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改 的)。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。
結(jié)論:
關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的垃圾讓別人來清理的。)
通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。
合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)。 ?
(1)欲阻止一個(gè)變量被改變,可以使用const 關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會(huì)再去改變它了;
(2)對(duì)指針來說,可以指定指針本身為 const,也可以指定指針?biāo)傅臄?shù)據(jù)為 const,或二者同時(shí)指?定為 const;
(3)在一個(gè)函數(shù)聲明中,const 可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對(duì)于類的成員函數(shù),若指定其為 const 類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量;
(5)對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。
、 static 關(guān)鍵字的作用:
(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,?因此其值在下次調(diào)用時(shí)仍維持上次的值;
(2)在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
(3)在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明?它的模塊內(nèi);
(4)在類中的 static 成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝;
(5)在類中的 static 成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。
、 extern "C" 的作用
(1)被 extern"C"限定的函數(shù)或變量是 extern 類型的;
extern 是 C/C 語(yǔ)言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。
(2)被 extern"C"修飾的變量和函數(shù)是按照 C 語(yǔ)言方式編譯和連接的;
extern "C"的慣用法
(1)在 C 中引用 C 語(yǔ)言中的函數(shù)和變量,在包含 C 語(yǔ)言頭文件(假設(shè)為 cExample.h)時(shí),需進(jìn)?行下列處理: ?extern"C" ?{ ?#include"cExample.h" ?} ?而在 C 語(yǔ)言的頭文件中,對(duì)其外部函數(shù)只能指定為 extern 類型,C 語(yǔ)言中不支持 extern "C"聲明,?在.c 文件中包含了 extern "C"時(shí)會(huì)出現(xiàn)編譯語(yǔ)法錯(cuò)誤。
(2)在 C 中引用 C 語(yǔ)言中的函數(shù)和變量時(shí),C 的頭文件需添加 extern "C",但是在 C 語(yǔ)言中不?能直接引用聲明了extern "C"的該頭文件,應(yīng)該僅將 C 文件中將 C 中定義的 extern "C"函數(shù)聲明為?extern 類型。
【iPhone軟件開發(fā)面試題】相關(guān)文章:
iphone鎖屏密碼忘了怎么辦12-31
投行面試題07-24
軟件測(cè)試面試題01-17
中層副職競(jìng)聘面試題09-05
來看看谷歌的面試題08-17
壓力危機(jī)類面試題目突破技巧11-09
人力資源行業(yè)常見面試題匯總02-03