指针的指针(**)的两个例子

1. 用于返回多个结果
#include <stdio.h>



static int HexStringToINT(char * pstr, char ** pstrNext)

{

    int data = 0;

    int NumberCount =  8;

    while(*pstr == ' ')

        pstr++;



    while(*pstr != ' ' && *pstr != 0 && NumberCount)

    {

        data = data << 4;



        NumberCount--;



        if( (*pstr) >= '0' && (*pstr) <= '9')

        {

            data += *pstr - '0';

        }

        else if( (*pstr) >= 'a' && (*pstr) <= 'f')

        {

            data += *pstr - 'a' + 0x0A;

         }

         else if( (*pstr) >= 'A' && (*pstr) <= 'F')

         {

            data += *pstr - 'A' + 0x0A;

         }

         else

         {

             data = data >> 4;

             *pstrNext = pstr;

             return data;

         }

              pstr++;

     }

     *pstrNext = pstr;



     return data;

}



int main(void)

{

	char a[10] = "123 456";

	char *p;

	char **ptr;

	ptr = &p;



	int data1,data2;



	p = a;



	data1 = HexStringToINT(p,ptr);



	data2 = HexStringToINT(p,ptr);



    printf("string is: %s\n\r",a);

	printf("data1 = %x\n\r",data1);

	printf("data2 = %x\n\r",data2);

}

         由于函数不能修改传递给它的参数,而HexStringToINT需要同时返回字符串转换为hex的数值和最后一个十六进制 字符后面的字符串。**pstrNext是一个指向char指针的指针。 
       HexStringToINT函数不能修改pstrNext,但可以修改*pstrNext。这是因为,main调用HexStringToINT的时候,将形参pstr,pstrNext被压入堆栈,HexStringToINT返回后pstr,pstrNext恢复为调用前的值。HexStringToINT修改*pstrNext也就是修改pstrNext所指向的char 指针P。执行data1 = HexStringToINT(p,ptr)后指针p的内容是" 456\o"。

通过使用**我们达到了设计目标。

2、用于链表

typedef struct{

	void*       FreeList; 

	int         BlkSize;                  

	int         FreeNub;               

}Node,*pNode;



/*

*空闲块链表:          +-----+--+    +-----+-+        +------+-+ 

*                    |FreeList|--->|      P|---> ...|NULL    |

*                    +-----+--+    +-----+-+        +------+-+

*					

*Free()将不再使用的Node添加到FreeList,Get()从FreeList取一个空闲块。

*/

char Free(pNode  pMem, void* pBlk,CPU_INT08U* err)

{

	*(void**)pBlk      =  pMem->FreeList;  //Note1

	pMem->FreeList  =  pBlk;               //移动头结点

	pMem->FreeNub++;

	return 0;

}

/*

* Note1 将pBlk转为为 void指针的指针。*(void**)pBlk表示pBlk保存的是一个void指针。

*       *(void**)pBlk = pMem->FreeList;的作用就是将pMem->FreeList的地址赋保存在pBlk中。

*/

void* Get (pNode pMem, CPU_INT08U*  err)

{

	void*       pBlk;

	

	pBlk = pMem->FreeList;            //获取头结点

	pMem->FreeList = *(void**)pBlk;   

	pMem->FreeNub--;	

	return pBlk;

}

你可能感兴趣的:(指针的指针(**)的两个例子)