int **p;
int row = 5;
int column = 10;
p = new int*[row];
for (int i=0; i<row; i++) {
p[i] = new int[column];
}
指針即是地址(0xf0765fea),是無符號(hào)整數(shù),占用四個(gè)字節(jié),32位。怎么判斷一個(gè)指針?biāo)赶虻念愋停?/font>
去掉一個(gè) * 和變量名后所留下的部分就是指針?biāo)赶虻念愋汀?/font>
如 int *p; 去掉一個(gè) * 和變量名 p 后就只有 int 了,所以 p 指向 int 的整形數(shù)。
float **p; 則 p 指向的類型是 float *,即 float 類型的指針,或 float 類型的地址,也即數(shù)組。
那么在給 p 分配內(nèi)存時(shí),p = new float*[23],即指向一些
在C或C++中有一個(gè)很好的地方是,即使你定義的變量是指針,但可與用訪問數(shù)組下標(biāo)的方法來訪問指針?biāo)赶虻臄?shù)據(jù);int **p; *(*(p+i) + j) 等同于 p[i][j],使用數(shù)組下標(biāo)來訪問更直觀。
使用變量來聲明數(shù)組的長(zhǎng)度,使程序更具有健壯性. int length = 10; int array[length].
給定一個(gè)二維數(shù)組和一個(gè)位置數(shù)loc,怎么確定這個(gè)數(shù)對(duì)應(yīng)數(shù)組中的那一個(gè)位置?
array[loc / column][loc % column]
當(dāng)定義一個(gè)數(shù)組時(shí),但沒有初始化,這時(shí)數(shù)組的內(nèi)容是還是原來內(nèi)存中的值。
void * 的使用
可以把任何類型的指針直接傳給 void* 的變量。
但是反過來,卻不能直接把 void* 傳給其他類型指針,必須明確的進(jìn)行強(qiáng)制類型轉(zhuǎn)換
int *pi;
void * pv = pi; // Ok
float *pf = (float*)pv; // Ok
double *pd = pv; // Error
char *str = (char*)malloc(sizeof(char) * number);
malloc分配一段內(nèi)存,返回這段內(nèi)存的首地址,其值為 void *,這樣,不管什么類型的指針都可以用這個(gè)函數(shù)來進(jìn)行內(nèi)存分配,void * 實(shí)現(xiàn)了相當(dāng)于 C++ 中的函數(shù)模板的功能,實(shí)現(xiàn)了在C中的多態(tài)。各種類型說明符,就是為了說明每次進(jìn)行存取的時(shí)候操作多少字節(jié)。
數(shù)組名是這個(gè)數(shù)組的首地址,與他的第一個(gè)元素的地址是指向同一個(gè)地址,但數(shù)組卻是一個(gè)常量,只能進(jìn)行右值計(jì)算,是不可改變的。指針變量也是指向地址,但指針變量是可以改變的,可以進(jìn)行右值計(jì)算,也可以左值計(jì)算。
字符數(shù)組的結(jié)束符號(hào)是'\0',其整型值是 0,即 NULL
雖然這樣,但在OpenGL中,如在 glGenTextures 的調(diào)用中,經(jīng)常用的是第一個(gè)元素的地址,而不是用數(shù)組名。
用數(shù)組實(shí)現(xiàn)折半查找:
在最壞的情況下,1024個(gè)元素只需要進(jìn)行10查找,但查找前要先排序
返回要查找的數(shù)在數(shù)組的下標(biāo),當(dāng)不在數(shù)組中是,返回 -1,因?yàn)閿?shù)組下標(biāo)是從0開始的。
int binarySearch(const int *p, const int g, int low, int height) {
int mid;
while (low <= height) {
mid = (low + height) / 2;
if (g < p[mid]) {
height = mid - 1;
} else if (g > p[mid]) {
low = mid + 1;
} else {
return mid;
}
}
return -1;
}
快速排序:
void quickSort(int *p, int low, int height) {
if (low >= height) {
return;
}
const int l = low;
const int h = height;
int ref = p[(low + height)/2];
int temp = 0;
// 如果沒有等于這個(gè)條件,那么如 3, 2, 1時(shí),就會(huì)造成下一次排序?yàn)?,2 ; 2, 3,多出來一個(gè) 2
while (low <= height) {
// 找到大于等于 ref 的數(shù),這里很重要,如果用 <= 的話,即找到比 ref 大的數(shù),
// 可能會(huì)造成數(shù)組越界
while (p[low] < ref) {
low++;
}
while (p[height] > ref) {
height--;
}
// 這個(gè)條件是必須的,否則不能正確排序, l1,3,4,2,2,3,h5, 3為ref
// 第一次排序后,1, 3, l4, 2, h2, 3, 5
// 第二次排序后,1, 3, 2, lh2, 4, 3, 5,這時(shí)還可以進(jìn)行下一次排序
// 第三次排序,h仍在2處,但l要找大于等于他的數(shù),即1, 3, 2, h2, l4, 3, 5
// 如果沒有這個(gè)條件,那么就要進(jìn)行交換,1, 3, h2, 4, 2, l3, 5,有錯(cuò)誤發(fā)生
if (low <= height) {
temp = p[low];
p[low] = p[height];
p[height] = temp;
low++;
height--;
}
}
quickSort(p, low, h);
quickSort(p, l, height);
// 第一次壓入(low, height)
// 從棧中取出一對(duì)(low, height)進(jìn)行每個(gè)片段的排序
// 每排完一遍后,即上面的while執(zhí)行完一次,壓入(low,h)和(l,height)
// 利用棧消除遞歸
return;
}
排序一般當(dāng)元素個(gè)數(shù)大于三十個(gè)時(shí)利用快速排序的速度比較快,當(dāng)元素個(gè)數(shù)小于三十個(gè)時(shí),利用選擇排序比較好,所以一般都是選擇排序和快速排序結(jié)合起來使用。