分享

周立功:安全有效地使用C掌握指针—指针的指针

 甲基丁酸 2017-07-09

周立功

如果有以下定义:

int iNum = 0x64;

int *ptr = &iNum;

当在“int *ptr;”定义前添加typedef:

typedef int *ptr;

此时,ptr等同于int *。为了便于理解,通常将类型名ptr替换为PTR_INT。比如:

 typedef int *PTR_INT;

显然有了PTR_INT类型,即可构造指向PTR_INT类型的指针变量pPtr。即:

其中, pPtr是指向PTR_INT*的指针变量,PTR_INT的类型为int *,pPtr是指向int **的指针变量,那么pPtr就成了保存int型ptr地址的双重指针,详见图 1.8。其定义方式简写如下:PTR_INT*pPtr = &ptr;

int **pPtr;

其中,指针的类型为int **,指针指向的对象的类型为int *,只要看到*就应该想到指针变量。由于*的结合方式是从右到左的,该定义相当于:

int *(*pPtr)= &ptr;

即*pPtr是一个一级指针变量。接着第一个*与(*pPtr)结合成为“*一级指针变量”,这同样是在定义一个指向指针类型数据的指针变量,即二级指针变量。

在双重指针变量前,既可加一个或两个指针运算符*,也可以加取地址运算符&。则以下关系恒成立:

*pPtr ==*(&ptr) == ptr == &iNum

**pPtr== *ptr == *(&iNum) == iNum

其相应的测试范例程序详见程序清单 1.10。

程序清单1.10  指向指针变量的指针测试范例程序

1       #include

2       int main(int argc, char *argv[])

3       {

4                int iNum   = 0x64;

5                int *ptr     =&iNum;

6                int **pPtr  = &ptr;

7

8                printf('&iNum = 0x%x, iNnm =0x%x\n', &iNum, iNum);

9                printf('&ptr = 0x%x, ptr =0x%x, *ptr = 0x%x\n', &ptr, ptr, *ptr);

10              printf('&pPtr = 0x%x, pPtr =0x%x, *pPtr = 0x%x, **pPtr = 0x%x\n', &pPtr, pPtr, *pPtr, **pPtr);

11              return 0;

12     }

用带参数的宏替换上述相关的语句后,使用gcc for MinGW版本编译运行的结果如下:

其相应的变量的存储与引用过程详见图 1.9。

实际上,指向指针的指针这一概念非常有用,比如,经常出现在链式数据结构中。当将指针传递给函数时,其传递的是值。如果想要修改原指针ptr,而不是指针的副本,则需要传递指针的指针pPtr。比如:

1       #include

2      

3       intchangePoint(int **pPtr)

4       {

5                 if((*pPtr= (int*)malloc(sizeof(int))) == NULL)                                                                                 

6                          return -1;

7                 return0;                                                                                                                                       

8       }

其中,*pPtr即ptr指向由malloc申请的地址空间,如果*pPtr被赋了NULL,就会被解释为二进制0表示失败。

 思考题

(1)向0x02000001地址存储空间赋值0xFA,其实现应为:____________________

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多