測試下C語言的基礎水平(答案)

第一題express

分析:主要考察setjump和longjump這兩個函數的做用。從英文字面意思咱們能夠知道是跳轉,程序的非本地跳轉。編程

只要知道了這兩個函數的功能,就很容易知道本題的答案爲:(b) 5數組

第二題app

分析:程序的意思是將一個結構體指針轉換爲整型指針,結構體是由三個整型的變量構成的,存放在內存的位置是連續的。此結構體的大小爲12字節,int型的爲4字節,咱們知道在32位機器上面,指針類型佔用4個字節。將結構體類型的指針轉換爲int型指針,那麼int型指針就指向告終構體中第一個整型變量。ide

因此輸出結果爲:(a) 3函數

第三題spa

分析:經過遞歸來求x^n,分奇偶次方來求。指針

答案爲:(a) x^n遞歸

第四題內存

分析:咱們知道數組的名字就是數組的首地址,也即數組第一個元素的地址。a+1就是對應的第二個元素a[1]。對數組名字就行取地址操做&a得到的是該數組的地址,由於數組的長度爲5,那麼&a+1就指向了下一個數組,即&a+1就至關於&a[4]+1,因此prt-1 就是&a[4]。
因此答案爲:(c) 2 5
第五題
分析:此題考察二維數組,在C語言中二維數組是按照一維數組來處理,即先存放行而後是列,即前面是行數後面是列數。a[3][3]表示a有三行三列,能夠當作是三個一維數組(每一個數組有三個元素)構成。數組名字a表示數組第一個元素地址,也是第一行的地址,也就是第一個數組的地址。對a進行++a後變成了第二行,也就是第二個數組的地址,其實++a至關於進行了a=a+3操做。在調用函數foo中,是進行的值傳遞,不改變a的值,只是改變了a中的元素。調用函數的時候進行實參與造成的傳遞,b[][3] =  { { 1,2,3} , { 4,5,6},{7,8,9}}; ,當進行++b後,b變成了第二行了,即b[][3] =  { 4,5,6},{7,8,9},{ }}; 此時的b[1][1] = 8,改爲了9。調用結束後輸出a[2][1]爲:9。

因此答案爲:(b) 9

第六題

分析:此題考察逗號表達式,不多用到。咱們知道逗號表達式最終取值是最後一個變量的值,逗號運算符的優先級低於賦值運算符,因此c=a,b; 執行的操做是先將a賦給c,而不是將b賦給c。因此c=3。而d=(a,b); 就不同了,逗號表達式加括號了,優先級最高,先計算括號裏面的值,而後將最後的結果賦給d。逗號表達式值取最後一個變量的值b,因此d=b

答案爲: (c) c=3 d=5

第七題

分析:主要考察指針數組和數組指針的區別。指針數組是者數組中存放的元素是指針,本質上是一個數組,例如 int *p[2],定義了一個指針數組 ,存放兩個整型的指針。而指針數組是說指針指向一個數組,本質是一個指針,例如 int (*p) [3] ,定義了一個指向一個含有三個元素的數組的指針。
int m =9,int n=10;
int *p[2] ={&m,&n}; //指針數組,數組中有兩個整型指針
printf("%d %d",*p[0],*p[1]); //輸出m和n的值
而本題中
int a[][3= { 1,2,3 ,4,5,6};  //定義了一個二維數組
int (*ptr)[3=a;  //定義一個數組指針,指向二維數組a,ptr也就是數組a的首地址
printf(
"%d %d " ,(*ptr)[1], (*ptr)[2] );  //輸出 2 3
 
++ptr;  //指向下一個至關於 ptr = a+3,指向a[1]
printf(
"%d %d" ,(*ptr)[1], (*ptr)[2] );  //輸出 5 6

答案:(a) 2 3 5 6

第八題

分析:f1中返回臨時變量的地址,在函數調用結束後臨時變量已經銷燬。不對。f2中  ptr沒有分配內存空間,直接就賦值返回,不對。f3分配了內存空間,動態分配。能夠。

答案:(c) Only f1 and f2 

第九題

分析:由於sizeof是運算符,不是函數。咱們不少時候都將sizeof當成了函數,這是不對的。sizeof只對數據類型進行斷定而不是去計算表達式。因此i的值不會改變。關於sizeof咱們能夠看看MSDN上如何對sizeof進行定義的:
sizeof Operatorsizeof expression The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses). When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

答案 :(c) i=3 j=4

第十題

分析:考察函數參數的傳遞方式,值傳遞和地址傳遞。值傳遞在函數調用後不改變實參,而地址傳遞在函數調用後改變實參。只要知道這一點,本題就很好解答。f1和f2中的兩個參數第一個都是地址傳遞,第二個都是值傳遞。

答案: (a) 5 5 5 5

第十一題

分析:考察遞歸函數的調用,調用深度,調用後一級一級的返回。
e(3)  e(2)   e(1)
e(3):                                                  e(2):                                               e(1):
   e(2)                                                         e(1)                                                e(0)
   printf("%d" , n);  //2                                printf("%d" , n);  //1                     printf("%d" , n);  //0  
 e(1)                                                            e(0)                                                e(-1)

答案:(a) 0 1 2 0

第十二題

分析:考察函數指針和typedef。函數指針的形式是:數據類型標誌符 (指針變量名) (形參列表); 例如:int (*f) (int x); /* 聲明一個函數指針 */
typedef爲C語言的關鍵字,做用是爲一種數據類型定義一個新名字。在編程中使用typedef目的通常有兩個,一個是給變量一個易記且意義明確的新名字,另外一個是簡化一些比較複雜的類型聲明。 typedef int (*test) ( float* ,float*)  中test是一個函數指針,通過typedef定之後成爲一個函數指針的數據類型。因此test tmp中temp是一個指向函數的指針,這個函數返回整型值

答案:(c) Pointer to function having two argument that is pointer to float and return int 

第十三題

分析:考察數組地址的變化。buf是數組的起始地址,也即第一個元素的地址&buf[0],buf+1就是數組的第二個元素的地址&buf[1],如今要以buf+1做爲起始地址,(buf+1)[5] 至關於 buf+1+5 即buf[6]

答案:(c) 9

第十四題

分析:數組中存放能夠分高地址和低地址兩種順序存放。在調用函數f中 p+=sizeof(int) 至關於 p+=4 此時p指向第五個元素,再取p[-1]就至關於p-=1;此時指向了第四個元素。返回給t即 t =「gh」

答案:(d) gh

第十五題

分析:考察不定參數函數的知識點。

答案:(c) 5

第十六題

分析:主要考察靜態變量static,靜態變量的生存期是在整個程序結束的時候才結束。內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)。
答案:(b) 15
相關文章
相關標籤/搜索