2010年1月21日 星期四

指標 pointers 重點整理

char multi[5][10];

What is (multi+1)?
What is *(multi+1)?

它們是一樣的!
都是 &multi[1][0] 這個 address

multi[row][col] 等於 *( *( multi + row) + col)


*ptr++ 等價於 *(ptr++) ... 什麼鬼東西= =

*dynamic memory allocation of n-dimensional array (n>1)

A. 二段式分配法,先尻重拳,再追加昇龍拳!

int** rowptr;
rowptr = malloc( nrows * sizeof(int *) );
rowptr[i] = malloc( ncols * sizeof(int) );

總共有1+nrows次的malloc呼叫
雖然可以使用rowptr[i][j]這種array notation的方式來存取
但是實際上memory是不連續的


B. 放大绝先,再慢慢消血!

int** rowptr;
int* aptr;
aptr = malloc( nrows * ncols * sizeof(int) );
rowptr = malloc( nrows * sizeof( int * ) );
/* ............................ */
rowptr[0] = aptr + ( 0 * ncols );
rowptr[1] = aptr + ( 1 * ncols );
rowptr[2] = aptr + ( 2 * ncols );
/* ............................ */

總共只有兩次的malloc
優點是事先分配的一大塊空間是連續的
所以使用像memset( ) 這樣的函數可以一次到位
缺點是記憶體空間的使用比較沒有彈性
例如使用 free( ) 函數時
需要一整塊還回去