周立功 如果有以下定义: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。
用带参数的宏替换上述相关的语句后,使用gcc for MinGW版本编译运行的结果如下: 其相应的变量的存储与引用过程详见图 1.9。 实际上,指向指针的指针这一概念非常有用,比如,经常出现在链式数据结构中。当将指针传递给函数时,其传递的是值。如果想要修改原指针ptr,而不是指针的副本,则需要传递指针的指针pPtr。比如:
其中,*pPtr即ptr指向由malloc申请的地址空间,如果*pPtr被赋了NULL,就会被解释为二进制0表示失败。 思考题 (1)向0x02000001地址存储空间赋值0xFA,其实现应为:____________________ |
|