C语言指针数组与数组指针

    
指针是为此来存放在另外一个变量的地方之变量。C语言中,指针被大运用。有时是为非用不可,有时是以它能够被代码更艰难凑,更敏捷。指针也是一个定时炸弹,稍有不慎会招致程序崩溃。另外,指针乱飞为会见影响程序的可读性。指针和数组关系密切,基本上能用数组的地方,都好为此指针来落实。

最近以整GPS和SMS的分析程序,里面根本涉嫌字符串的辨析,如GPS的GPRMC语句之解析,自定义的SMS控制指令的分析,用二维字符数组是好化解的,但效益比用指针数组差很多,执行效率不如和内存以十分。有接触吃苦不捧场的意。下面简单对比一下少种方法的兑现。

TCHAR szGPSSentence[128]; //待解析的GPRMC语句
TCHAR szGPSFields[16][16]; //使用二维数组时,用来存放在各字段的Buf
TCHAR *pGPSFields[16]; //使用指针数组时,用来存放各字段的指针

 

//使用二维数组时的分析代码
int SplitSentenceToFields1(TCHAR *src,TCHAR szFields[16][16])
//int SplitSentenceToFields1(TCHAR *src,TCHAR szFields[][16])
//int SplitSentenceToFields1(TCHAR *src,TCHAR (*szFields)[16])
{
    int i = 0;
    int j = 0;

    while(*src)
    {
        if(*src != _T(‘ ‘))
        {
            szFields[i][j++] = *src;
        }
        else
        {
            szFields[i++][j] = 0;
            j = 0;
        }
        src++;
    }
    szFields[i++][j] = 0;
    return i;
}

//使用指针数组时的剖析代码
int SplitSentenceToFields2(TCHAR *src,TCHAR *pFields[])
{
    int i = 0;

    if(*src)
    {
        *(pFields + i++) = src;                

        while(*src)
        {
            if(*src++ == _T(‘ ‘))
            {
                *(pFields + i++) = src;                

                *(src-1) = 0;
            }
        }
    }
    return i;
}

   
对比以上两种实现方式,可以见见,方法一中使用了少截很之buffer,一个之所以来囤积待分析的口舌,另外一个就此来存放解析后的各级字段。方法二吃,巧妙的施用了急需分析的囤空间,避免了数码的正片,节省了仓储空间。当然,如果每个字段只生一个字符,而字段往往较多时,结果虽反而了,好于这种状态很少生。经常有的是,在一行语句被,有一个字段特别长,而其余字段都非常短缺,这时用第二种植办法就是展示又快速了,如下图所出示。

C语言 1

 

      最后,需要小心指为数组的指针与指针数组的别,[]比*的预先级赛,在声明一个针对性数组的指针是得上加括号,如char (*p1)[16],表示p1为一个指针,指向存放有16只char类型的再三组,如果无括号则改为char *p2[16],表示p2为一个累组,存放有16独依靠于字符的指针。所以,p1占4单字节,而p2则占16*4=64个字节。