阅读复杂的 const 声明的简单规则?

2024-03-29

为了读取复杂的指针声明,有左右规则 https://web.archive.org/web/20110818081319/http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html.

但这条规则没有提到如何阅读const修饰符。

例如在一个简单的指针声明中,const可以通过多种方式应用:

char *buffer; // non-const pointer to non-const memory
const char *buffer; // non-const pointer to const memory
char const *buffer; // equivalent to previous declartion
char * const buffer = {0}; // const pointer to non-const memory
char * buffer const = {0}; // error
const char * const buffer = {0}; // const pointer to const memory

现在如何使用const用指针声明的指针?

char **x; // no const;
const char **x;
char * const *x;
char * * const x;
const char * const * x;
const char * * const x;
const char * const * const x;

阅读这些声明的简单规则是什么? 哪些声明有意义?

Is the 顺时针/螺旋规则 http://c-faq.com/decl/spiral.anderson.html适用的?

两个现实世界的例子

方法ASTUnit::LoadFromCommandLine http://clang.llvm.org/doxygen/classclang_1_1ASTUnit.html#ab18e63a754071c368a0afccbec0de8a8 uses const char **提供命令行参数(在 llvm clang 源中)。

的自变量向量参数getopt() http://linux.die.net/man/3/getopt声明如下:

int getopt(int argc, char * const argv[], const char *optstring);

Where char * const argv[]相当于char * const * argv在这种情况下。

由于这两个函数使用相同的概念(指向字符串的指针向量来提供参数)并且声明不同 - 明显的问题是:为什么它们不同?一个比另一个更有意义吗?

意图应该是:const修饰符应指定该函数不操作该向量的字符串,也不改变向量的结构。


The const修饰符很简单:它修改它前面的内容,除非 在它之前没有任何东西。所以:

char const* buffer;  // const modifies char
char* const buffer;  // const modifies *

等。一般来说,最好避免使用前面没有任何内容的形式 这const,但在实践中,你会看到它们,所以你必须 请记住,当前面没有类型时const,你必须逻辑上 将其移到第一种类型的后面。所以:

const char** buffer;

事实上是:

char const** buffer;

,即指向 const char 的指针。

最后,在函数声明中,[]读作 a 后*前。 (再次强调,最好避免这种误导性的符号,但是 你将会看到它,所以你必须处理它。)所以:

char * const argv[],  //  As function argument

is:

char *const * argv,

指向 char 的 const 指针的指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阅读复杂的 const 声明的简单规则? 的相关文章

随机推荐

  • ExpansionTile 不保持状态

    以下问题 我有一个清单扩展瓷砖 https docs flutter io flutter material ExpansionTile class html效果很好 我面临的唯一问题是 滚动到视图之外的展开的 ExpansionTile
  • android - Moto G 手机未显示在 Eclipse 的设备列表中

    我正在尝试将 Moto G Mobile 连接到我的 Windows 7 32 位计算机中的 Eclipse 但它没有显示在设备列表中 为此 首先我通过 USB 电缆将设备连接到机器 然后选择PTP模式 然后我检查了设备设置中的 USB 调
  • Spring批处理返回自定义进程退出代码

    我有一个包含多个作业的 jar 我只想每次只执行一个作业并检索自定义退出代码 例如 我有基本工作 retrieveErrorsJob 配置 只需一步即可读取输入 XML 文件并将数据写入特定数据库表中 应用类 SpringBootAppli
  • CMake - 删除单个翻译单元的编译标志

    我想删除单个翻译单元的设置编译标志 有没有办法做到这一点 例如使用set property 注意 编译标志没有 fno name否定 无论出于何种原因 我试过了 get property FLAGS TARGET target PROPER
  • 二维网格中的不同随机点

    我有一个大的二维网格 比如说 10000 X 10000 我需要从这些网格中选择 1000 个随机点 但我还需要注意这两个点都不相同 我想到的标准方法是在选择每个点之后 我应该检查所有先前的条目以查看该点是否已被选择 但对于大网格和大量点来
  • 连接到 EC2 Django 开发服务器

    我是 EC2 和 Web 开发的新手 目前我有一个正在运行的 Linux EC2 实例 并且已经安装了 Django 在开始我的实际项目并尝试运行 Django 测试服务器之前 我正在创建一个测试项目 这是我在 shell 中的输出 pyt
  • matplotlib:半球/楔形的自定义投影

    我正在看定制投影 http matplotlib sourceforge net examples api custom projection example htmlmatplotlib 库中的示例 我正在尝试修改它以仅绘制南半球 我已将
  • 快速处理大量 CSV 数据的最佳方法

    我有大量 CSV 数据集 10M 行 需要处理 我还有另外两个文件需要在输出时引用 它们包含的数据放大了我们对 CSV 文件中数百万行的了解 目标是输出一个新的 CSV 文件 其中每条记录都与其他文件中的附加信息合并 想象一下 大型 CSV
  • 如何使我的 Flask wtforms SelectField 看起来像下拉菜单?

    我创建了一个 SelectField 如下所示 class Inputs Form myChoices number of choices myField SelectField u Field name choices myChoices
  • 使用 sfFilter 用 Doctrine 更新数据库

    我创建了一个 sfFilter 来更新用户所在的当前模块 class SessionFilter extends sfFilter public function execute filterChain if this gt isFirst
  • Rails - grouped_options_for_select

    我在使用选项组填充 Rails 中的选择框时遇到一些困难grouped options for select 我目前有 3 个实例变量 我想将它们添加到分组选择框的整个分组数组中 例如 我有 fruits which contains th
  • cmake v3.15.3 找不到 boost v1.71.0

    我正在尝试在 Windows 10 中从源代码构建以下软件 https github com FreeOpcUa freeopcua https github com FreeOpcUa freeopcua 我还安装了最新版本的 boost
  • 使用 decltype 作为成员函数返回类型时,声明顺序很重要

    为什么这有效 template
  • 从mysql输入的html中搜索数据

    我想从我的数据库 mysql 获取数据并将其显示在网站上 应该保存脚本 这是我已经拥有的文件的结构 includes db connect php functions php getdata php logout php process l
  • Tableview 滚动反弹并隐藏底部单元格

    我有一个显示在导航控制器下的视图 该视图在顶部包含一个子视图 在底部包含一个表视图 根据数据 表中的行可能超出可见高度 当我的行位于最后一个可见行下方时 如果我向上滚动视图 它会弹回来 不会停留在那里 有办法让它留下来吗 我尝试将父视图设为
  • 非常奇怪的 Drupal 7 404 行为

    我在 D7 中遇到了一些我以前从未见过的非常奇怪的行为 我已将一个新站点从我的开发机器迁移到测试机器 因此代码和数据库是相同的 在开发机器 Ubuntu 13 04 Apache PHP 5 5 3 上 一切正常 但在 Raspbian 上
  • Python:lxml.etree.tostring(with_comments=False)

    我调用以下命令并收到以下错误 gt gt gt lxml etree tostring tree getroot with comments False ValueError Can only discard comments in C14
  • solr 模式中的日期时间字段

    我正在使用 Solr 在我的数据库上进行搜索 并且我需要从 mysql 数据库获取一个具有 日期时间 数据类型的字段 因此我设置了选择查询以在 dataconfig xml 中获取此字段 并为此添加了字段名称schema xml 中的字段如
  • 将整个范围乘以值?

    因此 我能想到的在大范围 大约 450k 行 上完成此操作的最佳方法是使用以下 Sue do 代码 Range A1 Copy A1 Contains Value I want to multiply column by Range MyT
  • 阅读复杂的 const 声明的简单规则?

    为了读取复杂的指针声明 有左右规则 https web archive org web 20110818081319 http ieng9 ucsd edu cs30x rt lt rule html 但这条规则没有提到如何阅读const修