指针数组与数组指针

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 指针是用来存放另外一个变量的地址的变量。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,一个用来存储待解析的语句,另外一个用来存放解析后的各字段。方法二中,巧妙的使用了待解析的存储空间,避免了数据的拷贝,节省了存储空间。当然,如果每个字段只有一个字符,而字段数较多时,结果就相反了,好在这种情况很少发生。经常发生的是,在一行语句中,有一个字段特别长,而其他字段都很短,这时使用第二种方法就显得更高效了,如下图所示。
 
       最后,需要注意指向数组的指针与指针数组的区别,[]比*的优先级高,在声明一个指向数组的指针是需要添加括号,如char (*p1)[16],表示p1为一个指针,指向存放有16个char类型的数组,如果没有括号则变为char *p2[16],表示p2为一个数组,存放有16个指向字符的指针。所以,p1占4个字节,而p2则占16*4=64个字节。
目录
相关文章
|
7天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
15 1
|
17天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
17天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
17天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
22天前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
15 1
|
25天前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
17 0
|
1月前
|
编译器 C语言
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
|
3月前
|
搜索推荐 C语言
指针与数组
指针与数组
57 9
|
3月前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。
|
3月前
|
存储 程序员 C语言
指针的高级应用:指针数组、数组指针、函数指针等。
指针的高级应用:指针数组、数组指针、函数指针等。
101 0