最近開始在“牛客網”上做題,希望通過日積月累,每天記錄一點小知識,每天前進一小步。
今天練習的題目關于數組。
1. 數組存儲:鏈式存儲、順序存儲
線性表邏輯上是線性的,存儲上可以是順序的,可以是鏈式的
鏈式存儲可以連續,可以不連續,存儲時不管其連續還是不連續,都是用指針指向下一個結點
2.順序存儲的根據數組指針直接定位,在順序表的任何位置上插入一個數據元素,平均需要移動n/2個數據元素,算法效率為O(n)
3.稀疏矩陣:
有一個100*90的稀疏矩陣,非0元素有10個,設每個整型數占2字節,則用三元組表示該矩陣時,所需的字節數是(66)
解析:每個元素要用行號,列號,元素值來表示,由于二維稀疏矩陣的大小都是在256之內,所以行號和列號只需要char來存儲。在用三元組表示稀疏矩陣,還要三個成員來記住,矩陣的行數列數,總的元素數,所以所需的字節數是10*(1+1+1)*2+3*2=66
4.關于 int a[10]; 問下面哪些不可以表示 a[1] 的地址?
A. a+sizeof(int)?
// 不正確, 在32位機器上相當于指針運算 a + 4
B. &a[0]+1?
// 正確,數組首元素地址加1,根據指針運算就是a[1]的地址
C. (int*)&a+1?
// 正確,數組地址被強制類型轉換為int*,然后加1,這樣和B表示的一個意思
D. (int*)((char*)&a+sizeof(int))
// 正確,數據地址先被轉換為char*,然后加4,根據指針運算公式,向前移動4 * sizeof(char),之后被轉換為int*,顯然是a[1]的地址
// 不正確, 在32位機器上相當于指針運算 a + 4
B. &a[0]+1?
// 正確,數組首元素地址加1,根據指針運算就是a[1]的地址
C. (int*)&a+1?
// 正確,數組地址被強制類型轉換為int*,然后加1,這樣和B表示的一個意思
D. (int*)((char*)&a+sizeof(int))
// 正確,數據地址先被轉換為char*,然后加4,根據指針運算公式,向前移動4 * sizeof(char),之后被轉換為int*,顯然是a[1]的地址
5.基址:
假設以行序為主序存儲二維數組A=array[100][100],設每個數據元素占2個存儲單元,基地址為10,則A[5,5]的地址為(1020)。
解析:A[5][5]的地址為:5*100*2+5*2+10=1020,千萬不要忘記基址是10,不是0