数组内数据不使用for循环实现多个移动
题目:
有序数组中加入一个新的数据,需保持数组有序,如何操作?
方式A :for循环将后续数组依次后移。
方式B :内存拷贝
代码:
/***************************************************************************** ** 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++的指针,会有额外收获。
1. 指针+1,到底移动了多少个字节,是由指针类型决定的,如
int *p=0x1234;p=p+1;
则此时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