數組內數據不使用for循環實現多個移動

題目: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

相關文章
相關標籤/搜索