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

2021-08-07 06:31:17 字數 4793 閱讀 2265

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

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 結構體變數的首...