【问题标题】:Difference between Pointer Datatypes C [duplicate]指针数据类型 C 之间的区别
【发布时间】:2016-06-13 11:20:58
【问题描述】:

我是 C/C++ 编程的新手,我仍在学习指针数据类型之间的一些差异。但我在这些方面遇到了困难:

int *const x1;
const int *x2;
char *x3[3];
char (*x4)[3];
double* x5, x6;

我认为第一个应该是一个指向常量内存地址的整数变量
x2 应该是一个 const 的整型指针,对吧?

我不知道这是否正确。那么谁能解释一下它们之间的区别?

【问题讨论】:

  • 注意:int *a是一个指针,int a[2]也是一个指向2个值的指针(数组)。 int *a[2] 是指向数组的指针。可能对你理解有点帮助
  • @Hearner: int a[2] 不是指针(尽管在某些情况下它可能衰减为指针)。
  • @Hearner int *a[2] 是一个指针数组。
  • “感谢您的建议”这是一个新的
  • @Cheiron 我 认为 Sourav 表示试图将相同的概念应用于两种语言可能会导致不幸 - 通过巧妙地使用后增量如何无序和因此,如果人们真的试图评估将名为C 的变量除以(本身是后增量的)的结果,那么任何事情都可能发生。

标签: c pointers


【解决方案1】:
int *const x1;  // const pointer to int
                // x1 is const pointer, so it cannot point to anything else (once initilized),
                // but what it points to can changed

const int *x2;  // pointer to const int
                // x2 can points to something else,
                // but what it points to cannot be changed

char *x3[3];    // array of three pointers to char
                // (array of pointers)

char (*x4)[3];  // pointer to array of three char
                // (single pointer)

double* x5, x6; // x5 is pointer to double, x6 is just a double

【讨论】:

  • 最后一个例子不应该这样写。 * 属于变量名,因此星号应与其他声明的名称相同。
【解决方案2】:

对于此类问题,您可以通过cdecl 进行检查,例如对于您的第三个示例:

char *x3[3];

cdecl 返回:

将 x3 声明为指向 char 的指针的数组 3

对于你的第四个例子:

char (*x4)[3];

cdecl 返回:

将 x4 声明为指向 char 数组 3 的指针

【讨论】:

  • cdecl 不适用于多个声明(例如double* x5, x6;)。
  • @Holt:是的——你需要对那个应用一点常识,不要被*的关联性所吸引——我不打算做all OP 的作业给他。 ;-)
  • 感谢您访问本网站。不知道有这样的事情。
【解决方案3】:

您向后阅读 C 声明符。因此,“int * const”是一个指向 int 的常量指针(您可以更改 int,但不能在初始化后将指针指向其他地方);而“const int *”是指向常量 int 的指针(随心所欲地更改指针,但不要更改它指向的 int)。

“C 声明符语法是一个失败的实验。”根据 Bjarne Stroustrup 的说法。

【讨论】:

    【解决方案4】:
     int *const x1;
    

    指向int的常量指针,这意味着指针不能更改为指向任何东西。

    const int *x2;
    

    指向int 常量的指针。这里的整数是常数,这意味着你不能改变这个值。

    char *x3[3];
    

    指向char的指针数组(长度为3)

    char (*x4)[3];
    

    指向 char 数组(长度为 3)的指针

    double* x5, x6;
    

    x5 是指向 double 的指针,x6 只是一个 double 变量

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 2010-12-16
      • 2020-06-07
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多