題目:html
有序數組中加入一個新的數據,需保持數組有序,如何操做?c++
方式A :for循環將後續數組依次後移。數組
方式B :內存拷貝函數
代碼:spa
/***************************************************************************** ** Name:20130424-arrayCopy.c ** 有序數組內插入新的數據,然後續數據向後移動,傳統做爲for操做,改進方式使用內存拷貝 ** Author:Fivezh ** Date:20130424 ** Copyright (c) 2013,All Rights Reserved! *****************************************************************************/ #include <stdio.h> #include <string.h> void showArrary(int *pArray, int count) { int i; for (i = 0; i < count; ++i) { printf("%d ", *(pArray +i)); } printf("\n"); } int main(int argc, char const *argv[]) { int arrayList[10]={1,2,3,4,6,7};//原始6個數據 //現須要插入數據5,且保持有序 int insertData = 5; int *pInsertPoint = NULL; int i; showArrary(arrayList,10); for (i = 0; i < sizeof(arrayList); ++i) { // printf("%d ", arrayList[i]); if (arrayList[i] <= insertData) { continue; } else { pInsertPoint = &arrayList[i]; printf("insert before %d\n", arrayList[i]); break; } } if (pInsertPoint != NULL) { int *p = NULL; p = memmove(pInsertPoint+1,pInsertPoint,2*sizeof(int)); // p = memcpy(pInsertPoint+1,pInsertPoint,2*sizeof(int)); //當拷貝區域存在重疊區域時,memcpy()函數會致使覆蓋和cpy錯誤問題;而memmove()可有效避免 *pInsertPoint = insertData; } showArrary(arrayList,10); return 0; }
總結:指針
對數組的操做,潛意識裏只有循環操做,多理解c/c++的指針,會有額外收穫。code
1. 指針+1,到底移動了多少個字節,是由指針類型決定的,如htm
int *p=0x1234;p=p+1;blog
則此時p=0x1238內存
char *p=0x1234;p=p+1;
則此時p=0x1235
2. 數組名+1,到底移動了多少字節,
int a[10];
則a+1或&a[0]+1或(int *)&a+1或(int *)((char *)&a+sizeof(int))都可表示a[1]的地址,即&a[1]
參考1:騰訊2013年實習生筆試題目(附答案)http://www.cnblogs.com/xiaoxuetu/archive/2013/04/20/3032811.html
參考2:memcpy與memmove區別與實現 http://www.cnblogs.com/kekec/archive/2011/07/22/2114107.html