第1題/共11題【單選題】
關于指針的概念,錯誤的是:( )
A.指針變量是用來存放地址的變量
B.指針變量中存的有效地址可以唯一指向內存中的一塊區域
C.野指針也可以正常使用
D.局部指針變量不初始化就是野指針
回答正確
答案解析:
A:正確,指針變量中存儲的是一個地址,指向同類型的一塊內存空間
B:正確,地址是唯一的,一個指針變量中只能存儲一個地址,因此可以唯一指向內存中的一塊區域
C:野指針指向的空間時非法的,或者說該指針指向的空間已經不存在了,因此野指針不能使用
D:局部指針變量沒有初始化時里面就是隨機值,因此指向那個位置不一定,故將其看成是野指針
因此:選擇C
第2題/共11題【單選題】
以下系統中,int類型占幾個字節,指針占幾個字節,操作系統可以使用的最大內存空間是多大:( )
A.32位下:4,4,2^32 64位下:8,8,2^64
B.32位下:4,4,不限制 64位下:4,8,不限制
C.32位下:4,4,2^32 64位下:4,8,2^64
D.32位下:4,4,2^32 64位下:4,4,2^64
回答正確
答案解析:
32位系統下:
int占4個字節,指針表示地址空間個數,總共有2^32個,故占4個字節
64位系統下:
int占4個字節,指針表示地址空間個數,總共有2^64個,故占8個字節
因此:選擇C
第3題/共11題【編程題】
使用指針打印數組內容
作業內容
寫一個函數打印arr數組的內容,不使用數組下標,使用指針。
arr是一個整形一維數組。
我的答案:
#include <stdio.h>int main()
{int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };int* p = arr;int* pend = arr + 9;while (p <= pend){printf("%d ", *p);p++;}return 0;
}
參考答案:
#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};//在這里完成代碼// 分析:因為數組中存儲的元素類型是int類型的,因此只要給一個int的指針,依次取索引數組中的每個元素即可int* p = arr; // 數組名代表數組首元素的地址for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%d ", *p); // *p: 取到p所指向位置的元素++p; // 獲取p的下一個位置}return 0;
}
第4題/共11題【單選題】(這道題當時不會做,做錯了)
在小端機器中,下面代碼輸出的結果是:( )
#include <stdio.h>
int main()
{int a = 0x11223344;char *pc = (char*)&a;*pc = 0;printf("%x\n", a);return 0;
}
A.00223344
B.0
C.11223300
D.112233
(回答錯誤)我的答案:A
(正確答案是:C)
答案解析:
假設,a變量的地址為0x64,則a變量在內存中的模型為:
0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |
char類型的指針變量pc指向只能指向字符類型的空間,如果是非char類型的空間,必須要將該空間的地址強轉為char類型。
char pc = (char)&a; pc實際指向的是整形變量a的空間,即pc的內容為0x64,即44,
*pc=0,即將44位置中內容改為0,修改完成之后,a中內容為:0x11223300
低地址 高地址
0X 44 33 22 11
因此:選擇C
涉及的知識點:
大端存儲模式:是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中。
小端存儲模式:是指數據的低位保存在內存的低地址中,而數據的高位,保存在內存的高地址中。
第5題/共11題【單選題】
下面代碼的結果是:( )
#include <stdio.h>
int main()
{int arr[] = {1,2,3