Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C语言中的指针基础知识_C_Pointers_Struct - Fatal编程技术网

关于C语言中的指针基础知识

关于C语言中的指针基础知识,c,pointers,struct,C,Pointers,Struct,关于指针(在本例的结构中),我理解如果“a”是一个结构,并且“b”在结构中声明,那么我们可以通过以下方式访问数据: a->b 现在,我最近发现C有很多关于指针的快捷方式,其中之一就是上面提到的箭头操作符 我看到“a->b”被写成“[a]+b”,这样: a->b <=> [a] + b //meaning that they are interchangeable a->b[a]+b//意味着它们可以互换 然而,我很难理解“[a]+b”的实际含义,我非常希望有人能为我

关于指针(在本例的结构中),我理解如果“a”是一个结构,并且“b”在结构中声明,那么我们可以通过以下方式访问数据:

a->b
现在,我最近发现C有很多关于指针的快捷方式,其中之一就是上面提到的箭头操作符


我看到“a->b”被写成“[a]+b”,这样:

a->b <=> [a] + b //meaning that they are interchangeable
a->b[a]+b//意味着它们可以互换

然而,我很难理解“[a]+b”的实际含义,我非常希望有人能为我详细说明(或者我可能误读了,上面的内容是胡说八道!)。非常感谢

在C语言中,
[a]+b
没有任何意义。这是一个语法错误。你的书可能用这种符号来解释一些事情,但断章取义,它毫无意义。但是,它与其他几个指针快捷方式非常相似,可能会引起混淆。为了消除这种困惑,以下是我能想到的所有指针快捷方式:

  • a->b
    (*a).b
    的同义词,即访问指向
    结构类型的指针的成员
  • a[b]
    *(a+b)
    的同义词,即通过执行指向指定偏移量的指针算术来访问数组元素。
    • 注意,由于上述原因,
      a[b]
      b[a]
      同义,因为
      a[b]
      *(a+b)
      *(b+a)
      b[a]
      。邪恶的骗子会做类似于
      0[x]
      5[“string”]
      的事情来迷惑你。不要害怕,因为现在你知道答案了
  • *&a
    a
    的同义词,即解除对地址的引用。它创建一个指针,然后立即取消引用,生成原始对象。
    • 请注意,
      &a[b]
      转换为
      &*(a+b)
      ,后者转换为
      a+b
      &a[b]
      a+b
      都以相同的方式创建指向数组元素的指针。哪种方式是“最佳”方式取决于个人偏好、工作地点和月相
    • 请注意,
      &*a
      *&a
      不同。后者创建一个指针,然后取消引用,生成原始对象。前者假定
      a
      是一个指针,对其进行解引用,然后获取结果的地址,从而生成原始指针
      &*a
      被标准强制要求不去引用指针,并且可以安全地在
      NULL
      指针上使用
  • *(type*)&a
    是一种邪恶的黑客,你可能会不时看到。它获取
    a
    的地址,将指针强制转换为指向
    类型
    的指针,并取消对该类型的引用。这通常是未指定的行为*,但实际上会导致对象
    a
    的位被重新解释为
    类型
    对象。这使您可以获取
    float
    s或其他对象的位表示。也许有更好的方法来实现这一目标,但如果您偶然发现这一行代码,您至少会知道作者的意图
如果我想到他们,我会加上更多


*我说未指定是因为,如果你做了
inti=-1;printf(“%u\n”、*(无符号整数)和i),C标准没有规定是否打印值
UINT\u MAX
(对于两个补码),
UINT\u MAX-1
(对于一个补码)或
(无符号int)int\u MAX+2
(对于符号和幅度)。

在C语言中,
[a]+b
没有任何意义。这是一个语法错误。你的书可能用这种符号来解释一些事情,但断章取义,它毫无意义。但是,它与其他几个指针快捷方式非常相似,可能会引起混淆。为了消除这种困惑,以下是我能想到的所有指针快捷方式:

  • a->b
    (*a).b
    的同义词,即访问指向
    结构类型的指针的成员
  • a[b]
    *(a+b)
    的同义词,即通过执行指向指定偏移量的指针算术来访问数组元素。
    • 注意,由于上述原因,
      a[b]
      b[a]
      同义,因为
      a[b]
      *(a+b)
      *(b+a)
      b[a]
      。邪恶的骗子会做类似于
      0[x]
      5[“string”]
      的事情来迷惑你。不要害怕,因为现在你知道答案了
  • *&a
    a
    的同义词,即解除对地址的引用。它创建一个指针,然后立即取消引用,生成原始对象。
    • 请注意,
      &a[b]
      转换为
      &*(a+b)
      ,后者转换为
      a+b
      &a[b]
      a+b
      都以相同的方式创建指向数组元素的指针。哪种方式是“最佳”方式取决于个人偏好、工作地点和月相
    • 请注意,
      &*a
      *&a
      不同。后者创建一个指针,然后取消引用,生成原始对象。前者假定
      a
      是一个指针,对其进行解引用,然后获取结果的地址,从而生成原始指针
      &*a
      被标准强制要求不去引用指针,并且可以安全地在
      NULL
      指针上使用
  • *(type*)&a
    是一种邪恶的黑客,你可能会不时看到。它获取
    a
    的地址,将指针强制转换为指向
    类型
    的指针,并取消对该类型的引用。这通常是未指定的行为*,但实际上会导致对象
    a
    的位被重新解释为
    类型
    对象。这使您可以获取
    float
    s或其他对象的位表示。也许有更好的方法来解决这个问题
    a->b <=> a[0].b