ANSI-C 语法 - 数组声明,如 [*] 等

2024-01-29

ANSI C 语法来自-link- http://www.quut.com/c/ANSI-C-grammar-y.html给我以下数组声明规则:

 (1) | direct_declarator '[' type_qualifier_list assignment_expression ']'
 (2) | direct_declarator '[' type_qualifier_list ']'
 (3) | direct_declarator '[' assignment_expression ']'
 (4) | direct_declarator '[' STATIC type_qualifier_list assignment_expression ']'
 (5) | direct_declarator '[' type_qualifier_list STATIC assignment_expression ']'
 (6) | direct_declarator '[' type_qualifier_list '*' ']'
 (7) | direct_declarator '[' '*' ']'
 (8) | direct_declarator '[' ']'

现在我对这些有一些疑问:

  • 我可以仅在 C99 中使用除 (3) 之外的 (1) - (6) 吗?
  • (4)和(5)有什么用?关键字“静态”让我感到困惑。
  • 在哪里使用(6)?
  • 下面两个函数原型有什么区别:

    void foo(int [*]); and

    void foo(int []);

谢谢。


您不能使用类型限定符或static在 C89/90 中数组声明的大小部分。这些功能是 C99 特有的。

static在数组声明中告诉编译器你保证指定数量的元素将始终出现在作为实际参数传递的数组中。这可能有助于编译器生成更高效的代码。如果您在实际代码中违反了承诺(即传递较小的数组),则行为是未定义的。例如,

void foo(int a[static 3]) {
  ...
}

int main() {
  int a[4], b[2];
  foo(a); /* OK */
  foo(b); /* Undefined behavior */
}

The *数组声明的大小部分仅在函数原型声明中使用。它表明该数组具有可变长度(VLA)。例如,在函数定义中,您可以使用具有具体运行时大小的 VLA

void foo(int n, int a[n]) /* `a` is VLA because `n` is not a constant */
{
  ...
}

当你声明原型时你可以做同样的事情

void foo(int n, int a[n]); /* `a` is VLA because `n` is not a constant */

但如果你不指定参数名称(这在原型中是可以的),你就不能使用n当然是数组大小。然而,如果您仍然需要告诉编译器该数组将是 VLA,您可以使用*为了这个目的

void foo(int, int a[*]); /* `a` is VLA because size is `*` */

请注意,带有一维数组的示例并不是一个好的示例。即使你省略了*并将上述函数声明为

void foo(int, int a[]);

那么代码仍然可以正常工作,因为在函数参数声明中,数组类型无论如何都会隐式替换为指针类型。但是一旦你开始使用多维数组,正确使用*变得重要。例如,如果函数定义为

void bar(int n, int m[n][n]) { /* 2D VLA */
  ...
}

原型可能如下所示

void bar(int n, int m[n][n]); /* 2D VLA */

or as

void bar(int, int m[*][*]); /* 2d VLA */

在后一种情况下,第一个*可以省略(因为数组到指针的替换),但第二个不能省略*.

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

ANSI-C 语法 - 数组声明,如 [*] 等 的相关文章

随机推荐

  • 通过axios访问响应头

    我正在使用 Axios 对 API 进行安全的 POST 调用 这会在 位置 下的响应标头中返回一个 URL 我可以看到 Chrome 的开发工具中填充了 URL 但 Axios 的 JS 响应 如下 不包含以下信息 任何建议都非常收到 发
  • 为什么不能使用 ioremap 然后使用 remap_pfn_range?

    在我的驱动程序中 我试图映射从返回的地址ioremap到用户空间地址 返回什么样的地址ioremap 它与一个有什么不同kmalloc地址 如何映射从返回的地址ioremap 应插入哪个地址remap pfn range 你不需要iorem
  • QItemDelegate 和 QStyledItemDelegate 有什么区别?

    这两个类都为模型中的数据项提供显示和编辑功能 QStyledItemDelegate较新 Qt 文档关于QItemDelegate指出 请注意 QStyledItemDelegate 已经接管了绘制 Qt 的工作 项目视图 我们建议在创建时
  • YQL JSON 脚本未返回?

    我这里有一个脚本 几乎直接复制下来this http net tutsplus com tutorials javascript ajax quick tip cross domain ajax request with yql and j
  • 在 Matlab R2016b 中恢复旧的显示格式

    在 Matlab R2016b 中 显示某些数据类型的变量会显示有关该类型的信息 当通过键入不带最后分号的方式显示变量时会发生这种情况 使用disp功能 比较例如 Matlab R2015b 旧格式 仅显示数据 gt gt x 10 20
  • 在 C 中将一定数量的字符打印到 stdout 的最快方法

    我必须将一定数量的空格打印到标准输出 但这个数量不是固定的 我正在使用 putchar 但我不确定这是否很快 在 C 中将一定数量的字符打印到 stdout 的最快方法是什么 另外 我无法使用系统功能 谢谢你的帮助 我只想用fwrite 简
  • 内存非常有限的嵌入式系统中的 STL

    我目前正在构建一个嵌入式系统 使用 ARM Cortex M3 处理器和 64 KB SRAM 目前 我正在寻找一种方法来确保 STL 容器的确定性性能 其中包括确保我不会在运行时耗尽内存 我主要关心 STL 容器如何执行动态内存分配 尽管
  • 修复 primeng DataTable 中的标题

    我正在使用 PrimeNG4 1 0 rc 2 我想要创建的是具有固定标题的数据表 即使我将表格滚动到底部 就像 stackoverflow 顶部的固定菜单一样 标题也应该始终可见 I tried scrollable and scroll
  • 在 PL/SQL 块中使用单引号和双“单引号”

    这是需要执行的代码块 DECLARE STR CLOB BEGIN STR CREATE TABLE TNAME AS SELECT FROM INPUT TABLE IP WHERE IP DATE FIELD TO DATE 12 08
  • UserPrincipal.GetGroups 与 UserPrincipal.GetAuthorizationGroups?

    我正在使用 ASP Net 4 0 MVC 来查询活动目录 我正在尝试获取用户组成员身份的列表并对其进行迭代 我有一个奇怪的问题 要获取我正在使用的组 PrincipalSearchResult
  • 逐行累积和

    我有一个data table dt如下 df lt data frame t1 rep 0 5 t3 c 12 5 8 9 5 t7 c 25 48 7 9 14 dt lt setDT df dt t1 t3 t7 1 0 12 25 2
  • 将一系列数字生成为字符串 Python

    我需要循环遍历许多具有结构化文件名的文件 它们的形式为 Mar00 sav Sep00 sav Mar01 sav 目前我正在这样做 Years 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
  • Material-ui v4 无法读取每个组件未定义的属性“根”

    我已经迁移自Material UIv3 到 v4 现在我导入的每个组件都会出现此错误 app js 3581 未捕获类型错误 无法读取属性未定义的 根 在按钮 app js 3581 在 renderWithHooks app js 126
  • Angular JS在每个http请求上添加请求参数$http

    我想使用 Angular http 与 api 交互 但我需要将我的身份验证令牌存储到 http 以便在每个请求中 无论 post get put 删除 我希望令牌存在 我也看到人们放置标头中的令牌 我知道如何将其放入标头中 但我不确定将令
  • 使用 pandas 中的日期 - 删除日期时间中看不见的字符并转换为字符串

    我正在使用 pandas 导入数据dfST read csv parse dates timestamp date 在我的 csv 中 日期的格式为 YYY MM DD 这就是我所需要的 没有时间 我有几个数据集需要比较成员资格 当我将这些
  • File.listFiles 由于无效 UTF-8 字符而崩溃

    应用程序在目录中导航文件时崩溃 崩溃日志如下 JNI DETECTED ERROR IN APPLICATION input is not valid Modified UTF 8 illegal start byte 0xf6 art r
  • django 密码保护页面

    我想为法官做一个注册页面 但我想确保在进入注册页面之前你必须输入密码 每个法官都会有一个我将提供给他们的相同的密码 他需要一个简单的页面上有一个窗口用于输入我之前提供的密码 如果有人能够说出我如何创建这样的模型及其形式 或者是否有任何其他更
  • 在命令行上指定 emacs 中的窗口布局

    我希望能够在从命令行启动 Emacs 时指定它的窗口布局 更具体地说 我调用 emacs file1 file2 file3 file4 例如 请参阅 file1 buff list instead of the default that
  • HTML 行跨度 1,5(一倍半)

    假设我有下表 table border 2 tr td abcsss td td sdf td td def td td def td td defsssss td tr tr td abcsss td td sdf td td def t
  • ANSI-C 语法 - 数组声明,如 [*] 等

    ANSI C 语法来自 link http www quut com c ANSI C grammar y html给我以下数组声明规则 1 direct declarator type qualifier list assignment