C和指針一些筆試中的選擇題

第一次寫博客,可能沒有過多的幽默,只有乾貨,以後會慢慢改進

1.下列函數定義中,有語法錯誤的是()
A.void fun(int x,int *y)
{x* = *y;}
B.int *fun(int *x,int y)
{return x+=y;}
C.void fun(int *x,int y)
{*x += y;}
D.void fun(int x,int *y)
{*x = *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
{
char ch,*ptr;
union
{
short a,b;
unsigned int c:2,d:1;
};
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)
{
int count = 0;
x = 9999;
while(x)
{
count++;
x = x&(x-1);
}
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
{
int status;
short *pdata;
char errstr[32];
};
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

11.使用一輛卡車運輸n塊單塊1TB裝滿數據的硬盤,以時速80km/h行駛1000km將數據運送到目的地;卡車至少運送()塊硬盤才能使運輸速率超1000Gbps
A 2000
B 3000
C 4000
D 5000
E 6000
F 7000
我們平時鏈接的寬帶100M其實是100Mbps,而下載的速度10Mps,因爲1B = 8b,
首先把時間換算成s,1000/80*3600 = 45000s,
1000 * 8(這是1T的容量換算成GB的位數)*n/45000 = 1000
n =6000
答案:E

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)
{
return (x&y) + (x^y)>>1;
}
則運行Fun(729,271);結果是()
A.499
B.500
C.501
D.502
這道題從左邊括號看,(x&y),按位與相同爲1,我們可以認爲這步運算是把他們相同的部分取出來,然後(x^y),異或把不同的位數取出來爲1右移一位,剩下爲0,兩個相加,相同的部分取一份,不同的部分除2,就是求平均數。
答案:B

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章