你需要知道的各种指针运算( 二 )


在前面的指针运算p++例子中,char *list[]这样的声明是否很清楚地告诉你它表示一个字符串列表而*p是一个字符串?
例3对例2的for循环进行了重写,用string替换了char * 。
例3 添加一个typedef声明使笨拙的代码稍稍变得清晰

你需要知道的各种指针运算

文章插图
 
list的声明行现在变得简单,很清晰地表示它是个字符串列表,并且string *p也很清晰地表示p是个指向字符串的指针 。因此,*p表示一个字符串 。
最后,我们仍然需要记住字符串是个指向字符的指针 。例如,NULL是个合法的字符串值 。
我们甚至可以更进一步,例如使用上面的typedef加上typedef stringlist string*,声明一个字符串的二维数组 。这种方法有时候非常实用,但有时候只会增加记忆的负担 。
从概念上讲,函数类型的语法实际上是指向一个特定类型的函数的指针 。如果我们有一个头部类似下面这样的函数:
你需要知道的各种指针运算

文章插图
 
然后只要添加一个星号(并加上括号以保证优先级),就可以描述一个指向这种类型的函数的指针:
你需要知道的各种指针运算

文章插图
 
然后在前面加上typedef来定义一种类型:
你需要知道的各种指针运算

文章插图
 
现在我们可以把它当作一种类型使用,例如声明一个接受另一个函数作为其输入参数的函数,可以这样:
你需要知道的各种指针运算

文章插图
 
通过对函数指针类型的重新定义,那些接受其他函数作为输入的函数的表达—其中连环星号的书写曾是令人生畏的考验变得不再可怕 。
【你需要知道的各种指针运算】最后需要说明的是,指针实际上要比教科书所描述的简单得多,因为它实际上只是一个位置或别名,根本不需要涉及不同类型的内存管理 。像指向字符串的指针的指针这样的复杂构造总是会让人感到迷惑,但这只不过是因为我们以狩猎为生的祖先从来没有见到过这玩意而已 。至少,C提供了typedef这个工具来处理它们 。


推荐阅读