相关疑难解决方法(0)

如果不是内存地址,究竟什么是C指针?

在有关C的信誉良好的来源中,在讨论了&运营商之后给出了以下信息:

...有点不幸的是,术语[地址]仍然存在,因为它混淆了那些不知道地址是什么的人,并误导那些做的人:把指针当作地址通常会导致悲伤...... .

我读过的其他材料(来自同等声誉的来源,我会说)总是毫不掩饰地将指针和&操作符称为给出内存地址.我很想继续寻找事情的实际情况,但是当信誉良好的消息来源不同意时,这很难.

现在我有点困惑 - 究竟什么是指针,那么,如果不是内存地址?

PS

作者后来说:......我将继续使用"地址"一词,因为发明一个不同的 [术语] 会更糟.

c pointers memory-address

205
推荐指数
13
解决办法
3万
查看次数

C++是否包含整个C语言?

我在教程中读到C++包含整个C编程语言.

不过我也看过,在地方这样

如果你学习C++,你最终将学习大部分C语言,并且随着时间的推移会学习一些语言之间的差异.

所以我的问题只有这个:

如果我非常了解C++,我最终会学习"真正的"C语言(没有任何"差异"),因为完整的C90语言包含在C++ 11中吗?

c c++

10
推荐指数
3
解决办法
3119
查看次数

数组外的指针比较的基本原理是UB

因此,标准(参考N1570)说明了以下关于比较指针的内容:

C99 6.5.8/5关系运算符

比较两个指针时,结果取决于指向的对象的地址空间中的相对位置.... [在聚合中剪切明显的比较定义] ... 在所有其他情况下,行为未定义.

这个UB实例的基本原理是什么,而不是指定(例如)转换intptr_t和比较它?

是否存在一些机器架构,其中指针的合理总排序难以构建?是否存在一些优化或分析,不受限制的指针比较会阻碍?

这个问题的删除答案提到这条UB允许跳过段寄存器的比较并且仅比较偏移.保存特别有价值吗?

(同样删除的答案,以及此处的答案,请注意,在C++中,std::less需要对指针实现总顺序,无论正常比较运算符是否执行.)

c pointers undefined-behavior language-lawyer

6
推荐指数
1
解决办法
446
查看次数

为什么我下面的第二个片段显示未定义的行为?

二者clangg++似乎是符合在C++标准的段落[expr.const]/5的最后一个版本.以下代码段为两个编译器打印11.查看实例:

#include <iostream>
void f(void) {
  static int n = 11;
  static int* temp = &n;
  static constexpr int *&&r = std::move(temp);

  std::cout << *r << '\n';
}

int main()
{
  f();
}
Run Code Online (Sandbox Code Playgroud)

根据我对本段的理解,两个编译器都应该打印2016下面的代码.但他们没有.因此,我必须得出结论,代码显示未定义的行为,因为clang打印任意数字并g++打印0.我想知道为什么它是UB,考虑到例如标准的N4527草案?实例.

#include <iostream>
void f(void) {
  static int n = 11;
  static int m = 2016;
  static int* temp = &n + 1;
  static constexpr int *&&r = std::move(temp);

  std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer constexpr c++17

5
推荐指数
1
解决办法
147
查看次数