首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教 char* p 和 char *p都是一样的吧

2012-03-30 
请问 char* p 和 char *p都是一样的吧?请问char*p和char*p都是一样的吧?[解决办法]是一样的,只是书写风格

请问 char* p 和 char *p都是一样的吧?
请问   char*   p   和   char   *p都是一样的吧?

[解决办法]
是一样的,只是书写风格不同
[解决办法]
没区别,最好写成char *p;
如果按一下方式定义变量,可能会给人造成误解:char* p,q;
这里只有p是指针变量(char *),而q是字符型变量(char)
[解决办法]
char* p 是 Thinking in C++ 里推荐的。原因是这样写更符合逻辑
[解决办法]
C++ primer语录
char* p 强调这个声明语句定义的是一个指针
char *p 强调对象是一个指针
该书推荐第二种
本人习惯第一种

[解决办法]
是的,还有
char*p;
[解决办法]
按C语言的本意,应该使用
char *p;
的写法。它的含义是“*p表示的是一个char类型”;而因为*p是一个char类型,所以p就是一个指向char类型的指针了(否则根据*运算符的定义,*p不可能是char型)。这也很好解释下面的例子:
char *p, q;
这个声明语句表示“*p和q均表示char类型”。因此,q本身当然就是一个char型,p则是一个指向char的指针。

由此可见,C语言的语法定义时并没有单独把“指针类型”独立成一种变量类型,来对标识符进行修饰(除非你使用typedef强行定义出“指针类型”),而是通过引入*运算符与基本类型定义来完成对指针的定义的。同样地,也很容易理解下面的声明:
char **p;
这个声明语句说, "**p "应当是一个char型。所以我们就知道, "*p "就应该是一个指向char的指针;再进一步, "p "则是指向一个“指向char的指针”的指针。

用这种观点,我们还可以很容易就理解看似深奥的函数指针的定义:

char (*foo)(int age);

请先把(*foo)视为一个整体,就很好理解:这个声明语句是说, "*foo "是一个函数,它的接受一个int参数age,返回一个char值——就是菜鸟都看得懂的一个普通的函数声明啦。既然*foo是一个函数,那么foo自然应当是指向这类的函数的指针了。是不是很简单?假如使用“把‘char*’连在一起写,视之为一种指针类型”的观点(也就是char* p的写法所暗示的),在理解函数指针时,就很难直观地进行下去了,因为这种理解本来就不符合C语言的意图。

顺便说一句,写成
char* p;
的观念应该来自于Java。Java没有指针,但有数组。它把数组视为一种类型,所以:
char[] a, b;
中,char[]是一个整体,它修饰的是a, b而并非只是a. 但其实与 "char* a, b "除了形式相近之外,根本没有太多联系。对C语言的含义没有深入了解的人会觉得把char*作为像char[]一样的“指针类型”会很好理解。但其实他们并不了解为什么C语言要这样定义指针,甚至于不了解为什么定义指针要用“*”而不是“&”、“pointer”等别的符号或方式。当然执意觉得char* p;比较顺眼的,坚持分行写,问题也不大。只不过这完全不是C语言的本意罢了。而且前面也说了,在进入到复杂的函数指针之后这种想当然的理解方法根本无法解释函数指针的定义含义,实际上也加深了理解的难度。

如果坚持要引入一种“指针类型”的概念,我推荐使用typedef:
typedef char *char_ptr;

char_ptr p1, p2;
这样char_ptr才真正是一种指针类型,而p1, p2就都是指针了。

热点排行