/*
修改問題6 的array_offset函式, 使它訪問以列為主序的偽陣列, 也就是最左邊的下標率先變化. 這個新函式array_offset2在其他方面與原先的那個函式一樣.
例如:假定arrayinfo陣列包含了值3, 4, 6, 1, 5, -3, 3. 這些值提示我們所處理的是三維偽陣列.
第乙個下標範圍從4 到6; 第二個下標範圍從1 到5; 第三個下標範圍從-3 到 3.
在這個例子中, array_offset2被呼叫時將有3 個下標引數傳遞給它. 下面顯示了幾組下標值以及它們所代表的偏移量.
下標: 偏移量:
4, 1, -3 0
5, 1, -3 1
6, 1, -3 2
4, 2, -3 3
4, 3, -3 6
4, 1, -2 15
4, 1, -1 30
5, 3, -1 37
6, 5, 3 104
*/#define max_dim 10
intcompute_offset
(int dim,
int*arrayinfo,
int*arg,
int*weight )
;#include
#include
intarray_offset2
(int
*arrayinfo,..
.)int i;
va_list ap;
//引數指標
int arg[max_dim]
;//max_dim 最大維度, arg存放可變部分引數i
va_start
( ap, arrayinfo )
;for
( i =
0; i < arrayinfo[0]
;++i )
arg[i]
=va_arg
( ap,
int)
;//讀取可變部分引數值, 並存放到arg中
}va_end
( ap )
;int weight;
//weight(權), 表示當前維度乙個偏移量表示的前面維度累計累計偏移量(在記憶體中累計的實際偏移量)
return
compute_offset
( arrayinfo[0]
, arrayinfo, arg,
&weight );}
intcompute_offset
(int dim,
int*arrayinfo,
int*arg,
int*weight )
*weight = arrayinfo[2]
- arrayinfo[1]
+1;//把第一維的權返回給下一維(第二維)
return arg[0]
- arrayinfo[1]
;//返回第一維偏移量
}int offset;
offset =
compute_offset
( dim -
1, arrayinfo, arg, weight )
;//向高一維度遞迴
if( offset ==-1
)if( arg[dim -1]
< arrayinfo[dim *2-
1]|| arg[dim -1]
> arrayinfo[dim *2]
) offset +
=*weight *
( arg[dim -1]
- arrayinfo[dim *2-
1]);
//當前維度總偏移量 = 前面高維度總偏移量 + 當前維度權 * 當前維度偏移量
*weight *
= arrayinfo[dim *2]
- arrayinfo[dim *2-
1]+1
;//更新低一維權
return offset;
//返回當前維度總偏移量, 如果遞迴結束, 返回值就是函式總偏移量
}int
main
(void);
printf
("arrayinfo: ");
for( i =
0; i < arrayinfo[0]
*2+1
;++i )
printf
("\n");
offset =
array_offset2
( arrayinfo,4,
1,-3
);printf
("下標為: 4, 1, -3 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,5,
1,-3
);printf
("下標為: 5, 1, -3 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,6,
1,-3
);printf
("下標為: 6, 1, -3 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,4,
2,-3
);printf
("下標為: 4, 2, -3 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,4,
3,-3
);printf
("下標為: 4, 3, -3 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,4,
1,-2
);printf
("下標為: 4, 1, -2 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,4,
1,-1
);printf
("下標為: 4, 1, -1 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,5,
3,-1
);printf
("下標為: 5, 3, -1 時: 偏移量為: %d\n"
, offset )
; offset =
array_offset2
( arrayinfo,6,
5,3)
;printf
("下標為: 6, 5, 3 時: 偏移量為: %d\n"
, offset )
;return0;
}
程式執行結果:
C和指標 程式設計練習 第9章
這個問題的最後部分就是編寫函式 void decrypt char data,char const key 它接受乙個加密過的字串為引數,它的任務是重現原來的資訊.除了它是用於揭秘之外,它的工作原理應該與encrypt 相同 void decrypt char data,char const key...
C和指標 程式設計練習 第9章
標準i o庫並沒有提供一種機制,在列印大整數時用逗號進行分割.在這個練習中,你需要編寫乙個程式,為美元數額列印提供這種功能.函式把乙個數字字串 代表以美分為單位的金額 轉換成美元形式,如下表所示 輸入 輸出 輸入 輸出 null 0.00 12345 123.45 1 0.01 123456 1,2...
C和指標 第8章 陣列
1.2 2 arry arry 2 arry 2 1.3下標絕不會比指標更有效率,但指標有時會比下標有效。結論 1.當根據某個決定數目的增量在乙個陣列中移動的時候,使用指標比使用下標產生效率更高的 當這個增量是1並且機器具有位址自動增量模型時,這點表現更突出。2.宣告為暫存器變數的指標通常比位於靜態...