廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析
- 1.下面的程序的輸出是()。
- 2.在頭文件中#ifndef/#define/#endif的作用是
- 4.執行下面程序中的輸出語句后,輸出的結果是()
- 6.在32位處理器上,運行如下程序后p的值為()。
- 10.設有兩字符串“Beijing".“China"分別存放在字符串數組str1[15], str2[15]中,下面語句中能把“China”連接到Beijing”之后的為()。
- 12.若已定義char s[10];測則在下面表達式中表示s[1]的地址有誤的是
- 14.執行下面程序,運行結果是()。
- 15.設有程序段:char s[] =“china";char *p; p = s;則下面敘述正確的是()。
- 重要問題 無論什么時候都不要在main外面初始化,除非聲明并初始化
- 16.已有函數max(a, b),為了使函數指針變量p指向函數max,正確的賦值方法是()。
- 17.在32位處理器下執行以下程序,以下選項正確的是()。
- 18.定義一個函數實現交換x和y的誼,并將結果正確返回。能夠實現此功能的是
- 19.對以下代碼理解正確的是()。
- 21.執行下面程序,運行結果是
- 23.執行下面程序運行結果是
- 25.在32位的處理器上,定義以下結構體,則語句printf("%d",sizdof(struct s);的輸出結果是) 。
- 26.在32位ARM處理器上,執行如下程度,輸出結果為()。
- 27.有以下說明,則值為210的表達式是()
- 31.域名服務DNS的正向解析是().
- 32.TCP和UDP協議的相似之處是。
- 33.以下用于文件傳輸的協議是()。
- 34.對于下列說法,錯誤的是。
- 35.在以太網中實現IP地址到MAC地址的解析,主要通過()協議實現。
- 36.linux所有服務的啟動腳本都存放在()目錄中。
- 38.以下對信號的理解不正確的是()。
- 43.以下關于UART描術正確的
- 44.執行以下程序段,*c的結果是()
- 45.在stm32單片機中,以下對中斷理解正確的是()。
- 46.使用DMA技術的目的是()。
- 47.指令周期是指()。
- 48.主存貯器和CPU之間增加cache的目的是()。
- 49.沒有外存貯器的計算機監控程序可以存放在()。
- 50.用2條8位的數據總線傳輸64位二進制代碼,需要傳輸幾次()。
廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析
1.下面的程序的輸出是()。
#include <stdio.h
#define ADD(X) X+X
void main()
{int m = 1, n = 2, k = 3, sum;sum = ADD(m + n) * k; printf(" %d\n", sum);
}
A: 19
B:9
C:12
D:10
D
對比宏定義加括號 和 不加括號
ADD(X) X+X 和 ADD(X) (X)+(X)
#define ADD(X) X+X
ADD(m + n) * k = X + X * k = 1 + 2 + 1 + 2 * 3 = 4 + 6 = 10
#define ADD(X) (X)+(X)
ADD(m + n) * k = X + X * k = (1+2)+(1+2)* 3 = 3+3*3 = 12
2.在頭文件中#ifndef/#define/#endif的作用是
A:讓編譯器認為該文件為頭文什
B:避免頭文件重復包含
C:C語言強制規定并無實際意乂
D:以上都不對
B
1. 作用
防止頭文件被重復引用,防止被重復編譯。
2. 簡介
#ifndef 它是if not define的簡寫,是宏定義的一種,確切的說是預處理功能(宏定義、文件包含、條件編譯)三種中的一種——條件編譯。
使用#ifndef可以避免以下錯誤:如果在.h文件中定義了全局變量,一個C文件包含了.h文件多次,如果不加#ifndef宏定義,會出現變量重復定義的錯誤;如果加了#ifndef則不會出現這種錯誤.
4.執行下面程序中的輸出語句后,輸出的結果是()
#include <stdio.h>
void main()
{int i, j;i = 0x10; //hex(10) = Dec(16);j = 17;printf("“%d,%d\n", i - j, i + j);
}
A 1,32
B -1,32
C 1,33
D -1,33
i = 0x10; //hex(10) = Dec(16);
D
6.在32位處理器上,運行如下程序后p的值為()。
unsigned long *p =(unsigned long *)0x80001000;
*p = 0x10001234;p += 5;
A:Ox10001248
B:0x80001005
C:0x80001014
運行出錯,p地址沖突;
應該是 A或 C,或者 D 選項,報錯
如果
unsigned long *p =(unsigned long *)0x80001000;p += 5;結果:0x80001000 + 4*5 = 0x80001014 //注意 4*5 = 20 十六進制是14
如果
unsigned long *p = 0x10001234;p += 5;結果:0x10001234+ 4*5 = 0x10001234 +14 = 0x10001248 //注意 4*5 = 20 十六進制是14
10.設有兩字符串“Beijing".“China"分別存放在字符串數組str1[15], str2[15]中,下面語句中能把“China”連接到Beijing”之后的為()。
A: strcpy(str1, str2);
B: strcpy(str1, “China");
C: strcat(str1, "China");
D: strcat("Beijing". str2);
C
strcat(str1, “China”);// strcat(str1,str2);
12.若已定義char s[10];測則在下面表達式中表示s[1]的地址有誤的是
A: &s[1]
B: &s[0] + 1
C: s +1
D: S++
D
測試
void main()
{char s[5] = {1,2,3,4,5};char* p = &s[1];char* q = &s[0] + 1;char* k = s + 1;char* j = s++;printf(" %p\n", p);printf(" %p\n", q);printf(" %p\n", k);//printf(" %p\n", j);
}
14.執行下面程序,運行結果是()。
char* s = "abcde";
s += 2;
printf("%s",s);
A:字符’c的地址
B:不確定
C: cde
D:字符c'
C
15.設有程序段:char s[] =“china";char *p; p = s;則下面敘述正確的是()。
A: *p與s[0]相等
B: 數組s中的內容和指針變量p中的內容相等O
C: s數組長度和p所指向的字符串長度相等
D: s和p完全相同
A B C
void main()
{char s[10] = "china";char* p;p = s;printf(" *p = %c\n", *p);printf("s[0] = %c\n", s[0]);printf("p = %s\n", p);printf("s = %s\n", s);printf("\nstrlen(s) = %d\n", strlen(s));//s數組長度printf("strlen(p) = %d\n", strlen(p));//p所指向的字符串長度printf("sizeof(s) = %d\n", sizeof(s));//s數組占用空間大小,包含結束符,若定長是容量printf("sizeof(p) = %d\n", sizeof(p));//指針占用空間大小
}
strlen,求字符串長度,即字符個數;
sizeof,求字符串空間大小= 個數 * 單位字節數;
int a[] = {1,2,3};int b[10] = {1,2,3};printf("\nsizeof(a) = %d\n", sizeof(a));//s數組占用空間大小(可理解數組容量)printf("sizeof(b) = %d\n", sizeof(b));s數組占用空間大小,若定長是容量
重要問題 無論什么時候都不要在main外面初始化,除非聲明并初始化
變量定義到外面 p =s就報錯;
變量定義到 main里面就可以運行;
為什么?
無論什么時候都不要在main外面初始化,除非聲明并初始化;
驗證發現,確實如此;
如果要在main外面初始化,那么在聲明的時候就初始化,聲明和賦值不能寫成兩行;
char s[10] = "china";
char* p = s;
int a = 120;
void main(){}
“我覺得應該和代碼的執行順序有關,函數外,只負責分配內存,不負責執行任何東西,你的p = s;壓根就沒執行,因為main才是程序執行的入口”
“跟全局變量和局部變量 存儲位置有吧? ”
C語言中局部變量存在棧里,全局變量存靜態存儲區。
局部變量在棧空間上分配,這個局部變量所在的函數被多次調用時,每次調用這個局部變量在棧上的位置都不一定相同。局部變量也可以在堆上動態分配,但是記得使用完這個堆空間后要釋放之。
全局變量全部存放在靜態存儲區,在程序開始執行時給全局變量分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;
16.已有函數max(a, b),為了使函數指針變量p指向函數max,正確的賦值方法是()。
A: *p = max(a, b);
B: *p = max;
C:p = max;
D:p = max(a, b);
C
函數指針示例
int max(int a, int b) {return a > b ? a : b;
}void main()
{//定義函數指針int (*p)(int a, int b);//賦值,函數指針變量p指向函數maxp = max;//調用printf("(*p)(5,8) = %d\n",(*p)(5,8));
}
17.在32位處理器下執行以下程序,以下選項正確的是()。
char code[]="Hello world!";
char *p = code;
long a = 1000;
int n = 10;
A : sizeof(code) == 11
B : sizeof( p ) == 12
C : sizeof(a) == sizeof(n)
D : 以上都不對
C
long是長整型 long int的縮寫形式,int是整型。
后者包含前者,前者是后者的一種類型。所以說他倆沒區別,但又有點小不一樣。
寫代碼的時候用int,是默認,用long是專門標注強調,另外,long還分有無符號。
就好比去吃早點,不強調不吃芫荽,店家可能就會默認給你放上。
long和int在不同環境的編譯器下需要的存儲大小不同。
32位機中,
char: 1個字節
short: 2個字節
int: 4個字節
long: 4個字節64位機中,
char: 1個字節
short: 2個字節
int: 4個字節
long: 8個字節 //但是,我在64位系統,x86,x64編譯都是4
void main()
{char a = 10;short b = 10;int c = 10;long d = 1000;float e = 12;double f = 5;printf(" char %d\n", sizeof(a));printf(" short %d\n", sizeof(b));printf(" int %d\n", sizeof(c));printf(" long %d\n", sizeof(d));printf(" float %d\n", sizeof(e));printf("double %d\n", sizeof(f));
}
64位系統,x86編譯
64位系統,x64編譯
18.定義一個函數實現交換x和y的誼,并將結果正確返回。能夠實現此功能的是
//A
swapa(int x, int y) {int temp;temp = x;x = y;y = temp;
}//B
swapb(int* x, int* y)
{int temp;temp = x;x = y;y = temp;
}//C
swapc(int* x, int* y) {int temp;temp = *x;*x = *y;*y = temp;
}//D
swapd(int *x, int *y){int* temp;temp = x;x = y;y = temp;
}
C
void main()
{int a = 5, b = 9;swapa(a, b);printf("%d,%d\n", a, b);int c = 5, d = 9;swapb(&c, &d);printf("%d,%d\n", c, d);int e = 5, f = 9;swapc(&e, &f);printf("%d,%d\n", e, f);int g = 5, h = 9;swapd(&g, &h);printf("%d,%d\n", g,h);
}
(1)將指針作為實參,可以對該指針指向的對象,也就是實參進行修改
void swap2(int *n1, int *n2)
{int tmp;tmp = *n1;*n1 = *n2;*n2 = tmp;
}
swap(&a,&b);
使用引用形參達到目的
void swap(int &x, int &y)
{int t;t=x;x=y;y=t;
}
swap(&a,&b);
引用方式出錯
19.對以下代碼理解正確的是()。
(1) char *p = malloc(5);
(2) memcpy(p, "123456", 5);
(3) strcpy(p, "123456");
(4) free(p);*p=1;
A:(2)會導敵指針越界
B:(3)會導致指針計越界
C:(4)必然會使系統死機
D:以上都確
D
21.執行下面程序,運行結果是
#include <stdio.h>
long fib(int n){if (n > 2) {return (fib(n - 1) + fib(n - 2));}else {return 2;}
}
void main(){printf("%din", fib(3));
}
A: 2
B: 4
C: 6
D: 8
23.執行下面程序運行結果是
#include<stdio.h>
int w =3;
int fun(int k){if (k ==0)return w; return (fun(k-1)* k); //階乘
}
void main()
{
int w=10;
printf("%dIn", fun(5)*w);
}
A 360
B 3600
C 1080
D 1200
n*(n-1),
直到 n=1時,f(n-1) = f(0), return w; w=3;
即,fun(5) = 5*4*3*2*1*3 = 120*3;
fun(5)*w = 360 *10 = 3600;
25.在32位的處理器上,定義以下結構體,則語句printf(“%d”,sizdof(struct s);的輸出結果是) 。
struct s{int a;char b;float f;
};
四字節對齊
12
26.在32位ARM處理器上,執行如下程度,輸出結果為()。
typedef struct {char a;int b;char c;int d;
}_str_1_t;typedef struct {char a;char c;int b;int d;
}_str_2_t;printf("%d,%d", sizeof(_str_1_t), sizeof(_str_2_t));
16,12
64位也是16,12
27.有以下說明,則值為210的表達式是()
int x0[] = { 110, 120 }, x1[] = { 210, 220 };struct s x[] = { {100}, {200} }, *p= x;x[0].b = x0;
x[1].b = x1;A: *p->b
B: (++p)->a
C: *(p++)->b
D: *(++p)->b
D
31.域名服務DNS的正向解析是().
A將域名轉換為物理地址.
B將域名轉換為為IP地址
CIP地址轉換為物理地址
D:將IP也轉專換為域名
B
1、DNS的作用
正向解析:根據域名查找對應的IP地址
反向解析:根據IP地址查找對應的域名
DNS系統的分布式數據結構
2、DNS概述
在日常生活中人們習慣使用域名訪問服務器,但機器間互相只認IP地址,域名與IP地址之間是多對一的關系,一個Ip地址不一定只對應一個域名,且一個域名只可以對應一個Ip地址,它們之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析服務器來完成,整個過程是自動進行的。
32.TCP和UDP協議的相似之處是。
A:都是面向連接的協議
B:鄒是面向上連接的協議
C傳輸層協議
D以均不對
D
33.以下用于文件傳輸的協議是()。
A: HTML
B: SMTP
C: FTP
D: POP
C
FTP協議用于文件傳輸。
FTP是File Transfer Protoco文件傳輸協議的縮寫,FTP用于在網絡上進行文件傳輸的一套標準協議,使用客戶/服務器模式。它屬于網絡傳輸協議的應用層。文件傳送和文件訪問之間的區別在于:前者由FTP提供,后者由如NFS等應用系統提供。
FTP協議能操作任何類型的文件而不需要進一步處理,就像MIME或Unicode一樣。但是,FTP有著極高的延時,這意味著,從開始請求到第一次接收需求數據之間的時間,會非常長;并且不時的必須執行一些冗長的登錄進程。
34.對于下列說法,錯誤的是。
A: TCP協議可以提供可靠的數據流傳輸服務
B:TCP協議可以提供面向連接的數據流傳輸服務
C:TCP協議可以提供全雙工的數據流傳輸服務
D:TCP協議可以提供面向非連接的數據流傳輸服務
D
35.在以太網中實現IP地址到MAC地址的解析,主要通過()協議實現。
A: RTP
B: ARP
C: IGMP
D: ICMP
B
ARP協議 Address Resolution Protocol 地址解析協議
36.linux所有服務的啟動腳本都存放在()目錄中。
A: /boot
B: /etc/init.d
C:/opt
D: /proc/sys
B
38.以下對信號的理解不正確的是()。
A:信號是一種異步通信方式
B:信號只用在用戶空間進程通信,不能和內核空間交互
C:信號是可以被屏蔽的
D:信號是通過軟中斷實現的
B
43.以下關于UART描術正確的
A:全雙工、異步通信方式
B:半雙工、同步通信方式
C:全雙工、同步通信方式
D:半雙工、異步通信方式
A
全雙工、異步;
TX發送端、RX接收端;
UART空閑狀態通常保持在高電平,起始位給一個低電平,然后讀取數據,停止位給一個高電平。
44.執行以下程序段,*c的結果是()
char test[10] ={0,1,2,3,4,5,6,7,8, 9};
short *a = test;
a++;//short加2字節
int *b =a;
b++;//int加4字節
unsigned char *c=b;
c++;//char加1字節
A:7
B:6
C:2
D: 8
共,加加7字節,c= a+7
A
64位系統,x64,x86運行結果一樣printf("%d\n",*c); printf("%p\n", test);printf("%p\n", a);//short加2字節printf("%p\n", b);//int加4字節printf("%p\n", c);//char加1字節
45.在stm32單片機中,以下對中斷理解正確的是()。
A:GPIO無法產生中斷
B:多個中斷同時產生采取隨機進入中斷函數的方式
C:在main函數的while中執行某個函數時產生中斷,需等到該函數執行完中斷函數中執行
D:在中斷處理函數中盡量不要處理比較復雜的邏輯
D
46.使用DMA技術的目的是()。
A:解決CPU和主存之間的速度匹配問題
B:I/O設備相互之間可實現并行工作
C:解放CPU,提高資源利用率
D:可實現低速IO設備與主存直接交換信息
A
簡單地說是:控制是硬盤內部的控制讀寫,這樣有利于減輕CPU負擔,加快讀取速度。
復雜點,專業點:
Direct Memory Access(存儲器直接訪問)。這是指一種高速的數據傳輸操作,允許在外部設備和存儲器之間直接讀寫數據,既不通過CPU,也不需要CPU干預。整個數據傳輸操作在一個稱為"DMA控制器"的控制下進行的。CPU除了在數據傳輸開始和結束時做一點處理外,在傳輸過程中CPU可以進行其他的工作。這樣,在大部分時間里,CPU和輸入輸出都處于并行操作。因此,使整個計算機系統的效率大大提高。
47.指令周期是指()。
A: CPU從主存取出一條指令的時間
B: CPU執行一條指令的時間
C:CPU從主存取一條指令加CPU執行這條指令的時間
D: 時鐘周期時間
C
指令周期是取出一條指令并執行這條指令的時間。一般由若干個機器周期組成,是從取指令、分析指令到執行完所需的全部時間。
CPU周期 :又稱機器周期,CPU訪問一次內存所花的時間較長,因此用從內存讀取一條指令字的最短時間來定義。
時鐘周期: 通常稱為節拍脈沖或T周期。一個CPU周期包含若干個時鐘周期。
48.主存貯器和CPU之間增加cache的目的是()。
A:解決CPU和主存之間的速度匹配問題
B:擴大CPU中通用寄存器的數量
C:擴大主存貯器容量
D:既擴大主存貯器容量,又擴大CPU中通用寄存器的數量
A
高速緩沖存儲器(Cache)是位于CPU與主存間的一種容量較小但速度很快的存儲器。由于CPU的速度遠高于主存,CPU直接從主存中存取數據要等待一定的時間周期,Cache中保存著CPU剛用過或循環使用的一部分數據,當CPU再次使用該部分數據時可從Cache中直接調用,這樣就減少了CPU的等待時間,提高了CPU對主存的訪問效率.
49.沒有外存貯器的計算機監控程序可以存放在()。
A:RAM
B:ROM
C:RAM和ROM
D:CPU
B
50.用2條8位的數據總線傳輸64位二進制代碼,需要傳輸幾次()。
A:8次
B:4次
C:1次
D:2次