【问题标题】:What is the difference between char * x,y,z;char* x,y,z;char (*)x,y,z;?char * x,y,z;char* x,y,z;char (*)x,y,z; 有什么区别?
【发布时间】:2015-02-26 05:15:55
【问题描述】:

好的,我迷失在这些指针中,有人能准确地告诉我char * x,y,z;、char* x,y,z; 和 char (*)x,y,z; 之间的区别是什么吗?如果可以,请为您的答案或其他内容提供资源。

【问题讨论】:

标签: c pointers char


【解决方案1】:

这两条记录

char * x,y,z; 
char* x,y,z;

等价于

char *x;
char y;
char z;

考虑到这些声明是等价的

char*x;
char* x;
char * x;
char *x;

它们都将变量 x 声明为指向 char 的指针。

这条记录

char (*)x,y,z;

无效,不会被编译。

我认为你的意思是以下

char (*x),y,z;

在这种情况下声明

char ( *x );

等价于

char *x;

你可以用括号括起来一个声明符。所以上面的记录你可以这样写

char ( *x ), ( y ), ( z );

【讨论】:

  • 好吧,我差不多明白了,但 char (*) x,y,z; 和 char *x,y,z 一样只是好奇还是无法编译?!
  • @Disorted Casaanøva 不,它们不一样。声明符是 x 和 *x。你可以写 *( x ) 或 ( *x )。
  • 好的意思就是基本不会编译了。
  • @Disorted Casanøva 在这条记录 ( * )x 中有相邻的声明符(抽象声明符 ( * ) 和标识符 x)。你不能这样放置声明符而不用逗号分隔它们。
【解决方案2】:

前两个意思相同。它们将 x 声明为指向 char 的指针,将 y 和 z 声明为 char 变量。第三个将导致语法错误,正如@danielfranca 在 cmets 中指出的那样,不会编译。

【讨论】:

  • 感谢我在这个游戏中有点菜鸟!
  • 没问题!就在几个月前,我站在你的立场上。 :)
【解决方案3】:

如果您问这个问题,可能是因为您正在寻找一种将 x、y 和 z 都声明为指向字符的指针的简写方式。

在大多数情况下,您应该清楚这一点:

char *x, *y, *z;

在你会经常使用它的更复杂的情况下,你可以使用 typedef:

typedef char *cp_t;
cp_t x, y, z;

【讨论】:

  • POSIX 保留以_t 结尾的类型名称以供将来使用。
  • 嗯,你已经足够接近我的想法了! ;)
【解决方案4】:

以与您将要使用变量相同的方式声明变量。

char *x, y, z;

*x 是一个字符,y 是一个字符,z 是一个字符。所以x 是一个指向字符的指针。

void f(void), (*g)(void);

f 和*g 是没有参数或返回值的函数。所以g 是一个指向这样一个函数的指针。 *g 周围的括号是必需的,因为 (void) 比 * 绑定得更紧密。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2013-02-26
    • 2012-01-07
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多