1、main()
; int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}答:2,5
*(a+1
)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
&a+1不是首位址+1,系統會認為加乙個a陣列的偏移,是偏移了乙個陣列的大小(本例是5個int)
int *ptr=(int *)(&a+1);
則ptr實際是&(a[5]),也就是a+5
原因如下:
&a是陣列指標,其型別為 int (*)[5];
而指標加1要根據指標型別加上一定的值,不同型別的指標+1之後增加的大小不同。
a是長度為5的int陣列指標,所以要加 5*sizeof(int)
所以ptr實際是a[5]
但是prt與(&a+1)型別是不一樣的(這點很重要)
所以prt-1只會減去sizeof(int*)
a,&a的位址是一樣的,但意思不一樣
a是陣列首位址,也就是a[0]的位址,&a是物件(陣列)首位址,
a+1是陣列下一元素的位址,即a[1],&a+1是下乙個物件的位址,即a[5].
2、用預處理指令#define宣告乙個常數,用以表明1年中有多少秒(忽略閏年問題)
#define seconds_per_year (60 * 60 * 24 * 365)ul
我在這想看到幾件事情:
•#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)
•懂得預處理器將為你計算常數表示式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
•意識到這個表示式將使乙個16位機的整型數溢位-因此要用到長整型符號l,告訴編譯器這個常數是的長整型數。
•如果你在你的表示式中用到ul(表示無符號長整型),那麼你有了乙個好的起點。記住,第一印象很重要。
3、寫乙個"標準"巨集min ,這個巨集輸入兩個引數並返回較小的乙個。
#define min(a,b) ((a) <= (b) ? (a) : (b))
這個測試是為下面的目的而設的: •
標識#define在巨集中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準c的一部分,巨集是方便產生嵌入**的唯一方法,對於嵌入式系統來說,為了能達到要求的效能,嵌入**經常是必須的方法。
•三重條件操作符的知識。這個操作符存在c語言中的原因是它使得編譯器能產生比 if-then-else
更優化的**,了解這個用法是很重要的。
•懂得在巨集中小心地把引數用括號括起來 •
我也用這個問題開始討論巨集的***,例如:當你寫下面的**時會發生什麼事?
least = min(*p++, b);
結果是:
((*p++) <= (b) ? (*p++) : (*p++))
這個表示式會產生***,指標p會作三次++自增操作。
4、obj-c
的優缺點
objc
優點:
1) cateogies
2) posing
3) 動態識別
4) 指標計算
5)彈性訊息傳遞
6) 不是乙個過度複雜的 c 衍生語言
7) objective-c 與 c++ 可混合程式設計
缺點:
1) 不支援命名空間
2) 不支援運算子過載 3
) 不支援多重繼承 4
) 使用動態執行時型別,所有的方法都是函式呼叫,所以很多編譯時優化方法都用不到。(如內聯函式等),效能低劣。
一些面試題
q 您在什麼情況下會用到虛方法?它與介面有什麼不同?a 當在繼承類中想重寫某一方法時會用到虛方法 虛方法是類的成員函式,介面相當於抽象類.q override與過載有什麼區別?a override 就是覆蓋的意思,覆蓋父類的同名方法,而過載則是通過參數列來呼叫方法.q 值型別與引用型別有什麼區別?a...
一些面試題
1.如何檢視埠8080的程序 netstat anp grep 8080 lsof i 8080 2.在 tmp目錄下建立test.txt檔案,內容為 hello,world 用乙個命令寫出來。echo hello,world tmp test.txt 3.敘述下列服務的預設埠號。ftp 20,21...
一些面試題
1.給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 解 先選中前k個,從第k 1個元素到最後乙個元素為止,以k i i k 1,k 2,n 的概率選中第i個...