第一次寫部落格,可能沒有過多的幽默,只有乾貨,以後會慢慢改進
1.下列函式定義中,有語法錯誤的是()
a.void fun(int x,int *y)
b.int *fun(int *x,int y)
c.void fun(int *x,int y)
d.void fun(int x,int *y)
這道題首先要明確指標的作用以及指標的用法,指標儲存乙個位址,整型浮點型資料不能隨意加*,因為整型這些型別的值和指標的關係是由指標解引用得到的,所以d錯,x為整型不能作為位址被解引用。
答案:d
2.給出以下定義,下列哪些操作是合法的()
const char* p1 = 「hello」;
char* const p2 = 「world」;
a.p1++;
b.p1[2] = 『w』;
c.p2[2] = 『l』;
d.p2++;
這道題要明確const具體修飾指標哪個位置的作用,const char* p = char const *p;
它代表將指標指向的內容常量化,即內容不能被修改;而char *const p則代表,p當前的位址不能修改,而它的內容可以修改,所以p1不能執行賦值,p2不能執行指標移動。
答案: a
3.下面結構體
struct s1
; struct s1 *next;
}; sizeof(struct s1)是():
a.12位元組
b.16位元組
c.20位元組
d.24位元組
結構體不同的型別寫前寫後是有不同的大小的,它涉及記憶體對齊,具體請參考c和指標還有c語言深度剖析都有講到,而聯合體union由於所有變數共用乙份空間,即取最大位元組型別變數的大小即可。因為記憶體對齊,char ch,ptr*因為指標4個位元組,則ch原本佔乙個位元組為了對齊也建立4個位元組即共8個位元組,聯合體裡最大為整型4個位元組,最後乙個結構體型別指標4個位元組(所有指標都是4個位元組,在32為作業系統)。
答案:b
4.下面程式,求count的值是()
int func(int x)
return count;
} a.8
b.10
c.5
d.11
這是一道設計位運算的題,這個程式將x轉化為2進製,看含有的1的個數。9999&9998,9998&9997,每執行一次x = x&(x-1),會將x用二進位制表示時最右邊的乙個1變為0,從1到k-1位全是1,按位與的結果自然就是第k位和1~k-1位都變成0。9999二進位制應該為10011100001111,所以應該為8個1
答案:a
5以下**列印的結果是()(假設在i386系列計算機上)():
struct st_t
; struct st_t st[16];
char p = (char )(st[2].errstr + 32);
printf(「%d」,(p-(char*)st));
a.32
b.114
c.120
d.1112
此時這個p指標知道了結構體陣列第三個末尾則乙個結構體陣列元素40個位元組,3個120個位元組
答案:c
6.以下**執行後,val的值為():
unsigned long val = 0;
char a = 0x48;
char b = 0x52;
val = b << 8 | a;
a.20992
b.21064
c.72
d.0
我們來看一下編譯器vs2008給出的反彙編**
val = b << 8 | a;
003d13d4 movsx eax,byte ptr [b]
003d13d8 shl eax,8
003d13db movsx ecx,byte ptr [a]
003d13df or eax,ecx
003d13e1 cdq
003d13e2 mov dword ptr [val],eax
003d13e5 mov dword ptr [ebp-8],edx
我們可以發現,char型別左移並不妨礙越界,因為它們是把值放在暫存器裡然後再暫存器運算,而暫存器佔4個位元組,所以0x52二進位制01010010左移8位0101001000000000,0x48(01010010前面補八個0)就是0000000001001000,答案轉為十進位制為21064
答案:b
7。設有定義:char *p;
,以下選項中不能正確將字串賦值給字元型指標p的語句是()
a.p = getchar();
b.scanf(「%s」,p);
c.char s = 「china」;p = s;
d.*p = 「china」;
定義這個指標並沒有賦值,所以它是乙個野指標,所以b根本不能寫進去,d更不能賦值,a也是錯的,標準輸入之前沒有初始化指標。
答案:abd
8.在64位系統下,分別定義如下兩個變數:
char *p[10];
char(*p1)[10];
請問sizeof(p)和sizeof(p1)分別值為()
a.4,40
b.80,8
c.10,10
d.8,80
e.40,4
f.4,4
在64位系統下指標為8個位元組,第乙個p為指標陣列,每個元素為指標,佔4個位元組,則sizeof(p)為40,第二個為陣列指標,它是乙個指標所以sizeof(p1)佔8個位元組。
9.用十進位制計算30!(30的階乘),將結果轉換成3進製表示的話,該進製下的結果末尾會有()個0
a.6
b.8
c.10
d.12
e.14
f.16
十進位制轉三進製就是%3後所得餘數在從後往前讀出,30!三進製就是看1-30裡面每個因子有多少個因數3,3,6,9(3*3)有兩個3,12,15,18(3*3*2)有個三,21,24(3*8,4*3*2)兩個3,27有三個三.
答案:e
10.設x,y,t均為int型變數,則執行語句:
t=3;
x=y=2;
t=x++ | ++y;後,變數t和y的值分別為()
a.t=1 y=2
b.t=1 y=3
c.t=2 y=2
d.t=2 y=3
e.t=3 y=2
f.t=3 y=3
這道題考的是運算子的優先順序,自增運算子執行級別大於賦值運算子(賦值運算子優先順序很低),而且同乙個級別內 邏輯運算子比賦值運算子優先順序高。所以x++ | ++y為1,t =1;而邏輯或運算前面為真後面就不執行則,y= 2;
答案:a
12.test.c檔案包含如下語句:
#define ptr int*
typedef int* int_ptr;
int_ptr a,b;
int_ptr c,d;
檔案定義的四個變數,哪個變數不是指標型別?
a a
b b
c c
d d
e 都是指標
f 都不是指標
巨集定義為字元替換,它不是一種型別
而typedef是將原有型別定義為新的名字,是型別
所以int_ptr a,b a是指標,b是整型。
答案:b
13.假設在n進製下,下面的等式成立,567*456=150216,n值是()
a.9
b.10
c.12
d.18
這道題考的是進製轉換我們可以列乙個等式算出n值,(5*n^2+6*n^1+7)*(4*n^2+5*n+6)=1*32+5*16+0+2*4+1*2+6
算出來n = 18
答案:d
14.有如下規約:
digit->0|1|…|9
digit->digit digit*
optionalfraction->.digits|
optionalexponent->(e+|-|digits)|
number ->digits optionalfraction optionlexponent
對於上面給出的正則規約描述,下列無符號數中,不符合規約要求的是()
a.5280
b.1
c.2.0
d.336e
這道題看起來很沒有頭緒,這道題從最後乙個來看,它包含了上面幾行的約定,所以推斷應該是乙個篩選合格約定的數字我們來看一看,5280裡面的數字選數首先5280符合0-9,digit*是意思組合5280就是5 2 8 0組合起來,optionalfraction可以加.當作小數,5280可以為5280.可以為5280,optionalexponent意思是有e後面就要有加減運算,1和2.0也符合,只有336e後面沒+/-。所以d錯
答案:d
15.int fun(int x,int y)
則執行fun(729,271);結果是()
a.499
b.500
c.501
d.502
這道題從左邊括號看,(x&y),按位與相同為1,我們可以認為這步運算是把他們相同的部分取出來,然後(x^y),異或把不同的位數取出來為1右移一位,剩下為0,兩個相加,相同的部分取乙份,不同的部分除2,就是求平均數。
答案:b
資料結構考試的一些選擇題
棧和佇列 樹和二叉樹 圖順序表 隨即訪問結構 在乙個有127個元素的順序表中插入乙個新元素並保持原來順序不變,平均要移動的元素個數為63.5 平均要移動的個數 n 2 補充1 n個元素的順序表中,查詢 平均移動的元素個數為 n 1 2 補充2 n個元素的順序表中,插入 平均移動的元素個數為n 2 補...
面試筆試遇到的一些題
sizeof 指標變數 大小為4個位元組 以32位計算機為例 也是,計算機位址32位,指標存的是記憶體位址,自然也要32位。堆和棧的區別 1 棧由程式自動分配,堆是程式設計師申請的,必須指明大小 2 程式結束,棧自動釋放,而堆還需要free或者delete,手動釋放 2 分配棧很快,只要剩餘空間足夠...
C 筆試中的一些問題摘抄
1.結構體求位元組大小問題 struct s1 struct s2 cout 對於s1,因為最大是int,所以前面得char short 1 4,在int 4,所以s1大小為8。s2char得補成int,short也一樣,所以是3 4 12 結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首...