在 C/C++ 中, char* arrayName[][] 是指向指针的指针还是指向指针的指针?

2024-02-12

我将多维数组理解为指向指针的指针,但也许我错了?

例如,我认为:

char * var = char var[]

char ** var = char* var[] or char var[][]

char *** var = char var[][][] or char* var[][] or char** var[]

这是不正确的吗?我很困惑,因为我在一个简单的教科书示例中看到 char*[][] 转换为 char** 。

我粘贴了下面的例子。谁能帮我解决这个问题吗?谢谢!


/* A simple dictionary. */
#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* list of words and meanings */

char  *dic[][40] = {
    "atlas", "A volume of maps.",
    "car", "A motorized vehicle.",
    "telephone", "A communication device.",
    "airplane", "A flying machine.",
    "", ""  /* null terminate the list */
};

int main(void)
{
    char word[80], ch;
    char **p;

do {
    puts("\nEnter word: ");
    scanf("%s", word);
    p = (char **)dic;
    /* find matching word and print its meaning */
    do {
        if(!strcmp(*p, word)) {
            puts("Meaning:");
            puts(*(p+1));
            break;
            }

        if(!strcmp(*p, word)) break;

        p = p + 2;  /* advance through the list */
        } while(*p);

    if(!*p) puts("Word not in dictionary.");
    printf("Another? (y/n): ");
    scanf(" %c%*c", &ch);

    } while(toupper(ch) != 'N');

return 0;

}

规则为C http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf如下:

6.3.2.1 Lvalues, arrays, and function designators
...
3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

语言为C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf有点不同:

4.2 Array-to-pointer conversion [conv.array]

1 An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to an rvalue of type “pointer to T”. The result is a pointer to the first element of the array.
...
8.3.4 Arrays [dcl.array]
...
7 A consistent rule is followed for multidimensional arrays. If E is an n-dimensional array of rank i × j × ... × k, then E appearing in an expression is converted to a pointer to an (n−1)-dimensional array with rank j × ... × k. If the * operator, either explicitly or implicitly as a result of subscripting, is applied to this pointer, the result is the pointed-to (n−1)-dimensional array, which itself is immediately converted into a pointer.

因此,以下内容均成立:

Declaration        Expression        Type             Decays to
-----------        ----------        ----             ---------
     T a[N]                 a        T [N]            T *
                           &a        T (*)[N]     
                           *a        T
                         a[i]        T

  T a[M][N]                 a        T [M][N]         T (*)[N]
                           &a        T (*)[M][N]  
                           *a        T [N]            T *
                         a[i]        T [N]            T *
                        &a[i]        T (*)[N]      
                        *a[i]        T
                      a[i][j]        T

T a[M][N][O]                a        T [M][N][O]      T (*)[M][N]
                           &a        T (*)[M][N][O]
                           *a        T [M][N]         T (*)[N]
                         a[i]        T [M][N]         T (*)[N]
                        &a[i]        T (*)[M][N]  
                        *a[i]        T [N]            T *
                      a[i][j]        T [N]            T *
                     &a[i][j]        T (*)[N]
                     *a[i][j]        T
                   a[i][j][k]        T

对于高维数组,该模式应该是清晰的。

那么让我们分析一下你的字典:

/* list of words and meanings */         

char  *dic[][40] = {         
    "atlas", "A volume of maps.",         
    "car", "A motorized vehicle.",         
    "telephone", "A communication device.",         
    "airplane", "A flying machine.",         
    "", ""  /* null terminate the list */         
};

这不会按照您想要的方式设置您的字典;您基本上已将其设置为包含 40 个 char 指针的 1 元素数组。如果您想要一个字符串对数组,则声明应如下所示:

char *dic[][2] = 
{
  {"atlas", "A volume of maps"},
  {"car", "A motorized vehicle"},
  {"telephone", "A communication device"},
  {"airplane" , "A flying machine"},
  {NULL, NULL} // empty strings and NULLs are different things.  
}; 

的类型dic是“指向 char 的指针的 2 元素数组的 5 元素数组”,或者char *[5][2]。根据上述规则,表达式dic应该衰减到char *(*)[2]-- 指向 char 指针的 2 元素数组的指针。

搜索该字典的函数将如下所示:

char *definition(char *term, char *(*dictionary)[2]) // *NOT* char ***dictionary
{
  while ((*dictionary)[0] != NULL && strcmp((*dictionary)[0], term) != 0)
    dictionary++;
  return (*dictionary)[1];
}

你可以从你的 main 函数中调用它,例如

char *def = definition(term, dic);

请注意,我们必须使用括号将*dictionary函数中的表达式。数组下标运算符[]优先级高于解引用运算符*,并且我们不想添加下标dictionary直接,我们想要将下标放入数组中dictionary 指着.

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

在 C/C++ 中, char* arrayName[][] 是指向指针的指针还是指向指针的指针? 的相关文章

随机推荐

  • MySQL 基于游标的多列分页

    我有一些表想要使用基于游标的分页进行查询 但它需要应用于多个列 让我们举一个使用 2 列的简化示例 我像这样获取第一页 SELECT column 1 column 2 FROM table name ORDER BY column 1 c
  • 一种唯一标识 BTLE 设备的方法

    有没有办法唯一地标识 BTLE 设备 类似于硬件 ID 我有 2 个硬件 BTLE 设备和 2 个软 BTLE 设备 使用 CBCentralManager 所有这些设备都发送相同的 UUID 当所有设备都位于我附近时 我想识别确切的 BT
  • 如何使用 jq 将当前日期和时间附加到现有 json 文件中

    我有以下格式的 json 文件 username achu password test1234 我只想将时间戳添加到上述有效负载中并将其作为某些服务的请求发送 据我所知 下面的命令将帮助我们获取 Linux 上的当前标记 date r 但不
  • 从脚本内获取 Swift 脚本的路径

    我正在用 Swift 编写一个脚本 我希望它修改一些始终与脚本本身位于同一目录中的文件 有没有办法从脚本内部获取脚本的路径 我试过 print Process arguments 但这仅输出实际提供给脚本的路径 该路径可能是完全解析的路径
  • 有没有办法使用http将打印任务发送到支持IPP的网络打印机?

    我正在开发一个 Android 打印服务应用程序 该应用程序应该允许用户执行以下操作 浏览手机的内部存储并将所选文件发送到支持 IPP 的打印机进行打印 这几天上网查了一下 只找到一个解决办法 如何在android中使用ipp 互联网打印协
  • Firefox 网络面板中的彩色条代表什么?

    在 Firefox 开发者工具中 在 Net 面板下 加载的资源的加载时间分为不同的颜色 类别 这些都是 DNS查询 连接中 Blocking Sending Waiting 接收 其中每一个代表什么 更具体地说 它们中的任何一个是否准确地
  • 通过 cython 将 python 字符串传递给 C

    我正在尝试编写一个包含一些 c 和一些 python 部分的模块 我正在使用 cython 来弥补差距 我想在 python 中存储我的 很长的 字符串常量 因为它有更好的语法 const char long string npart of
  • 识别常见的周期波形(方波、正弦波、锯齿波……)

    如果没有任何用户交互 程序如何识别 ADC 记录中存在什么类型的波形 对于这个问题 恒定频率的三角波 方波 正弦波 半正弦波或锯齿波 电平和频率是任意的 并且它们会有噪声 少量失真和其他缺陷 我也会提出一些 天真的 想法 你可以投票赞成或反
  • 使用 IIFE 时使用 CommonController 实例化其他 AngularJS 控制器

    我有一个项目 其中许多模型将由几乎相同的控制器代码管理 唯一的例外是它们调用不同的服务 我现在处理这个问题的方法是使用通用代码实例化一个 Crud Controller 到每个自定义控制器中 然后通过更改自定义控制器内的变量来重定向服务调用
  • 使用S3 for Rails“公共/图像”是否很好,并且有一种简单的方法可以做到这一点?

    我对 S3 有点陌生 我想知道将公共 图像放入 S3 存储桶中是否是一个好主意 如果是 是否有一种简单的方法可以进行移动 如果您查看 config environments production rb 您将看到以下代码行 已注释掉 conf
  • 如何在 iPhone 的“文件”应用程序中显示我的应用程序文档

    我正在尝试在 iPhone 上的 文件 应用中显示我的应用中的数据 查了很多资料 都对 就是不知道错在哪里 func fileManger nameFolder String let manager FileManager default
  • 为什么 Python 的 `re.split()` 不在零长度匹配上进行分割?

    一个特别的怪癖 否则相当强大 rePython中的模块是re split 永远不会在零长度匹配上分割字符串 http docs python org library re html re split 例如 如果我想沿单词边界分割字符串 gt
  • 导入时出现玩笑错误:意外的令牌导入

    我见过类似的问题 但仍然找不到可行的解决方案 我正在尝试将 Jest 集成到一个工作项目中 该项目在数百个地方使用导入 导出默认值 以下测试确实适用于使用 require 的 Jest const bar require flows foo
  • 谷歌地图覆盖层

    我试图在我的谷歌地图上放一个图层来覆盖它 不必与谷歌地图进行任何交互 它只是一层在另一层之上 我现在有什么 div div div div 在地图 div 中 我放置了谷歌地图 覆盖层的背景与地图 div 一样大 但谷歌地图始终将自己放在顶
  • 在 Emacs Lisp 中插入整月的日期

    我正在 Emacs Lisp 中进行一些编程 但我不完全确定如何处理某些事情 我正在尝试插入一整月的日期 每个日期都在一个新行上 如下列表所示 January 2009 年 1 月 1 日星期一 02 01 09 星期二 03 01 09
  • 如何在 Android Studio 3.0.0 中使用数据绑定和 Kotlin

    我刚刚开始使用 Android Studio 3 0 0 但每次尝试构建项目时都会收到此错误 Error Circular dependency between the following tasks app compileDebugKot
  • Eclipse - 可执行 jar 文件错误

    当我使用 eclipse 功能导出 可执行 jar 等时 当它制作罐子时我收到一条消息 JAR 导出已完成 但有警告 查看具体信息 详细信息 无法读取 JAR 文件 classpath 原因 打开 zip 文件时出错 我不知道这意味着什么以
  • 无法在 pandas 数据框中按时间戳建立索引

    我拿了一张 Excel 工作表 其中包含日期和一些值 并希望将它们转换为 pandas 数据框 并仅选择特定日期之间的行 由于某种原因 我无法按日期索引选择行 Excel 文件中的原始数据 MCU Timestamp 50D 10P1 10
  • 是否可以在 Android 中以编程方式卸载软件包

    软件包可以自行卸载吗 如果一个包共享相同的 userId 和签名 可以卸载另一个包吗 Uri packageURI Uri parse package your packagename here Intent uninstallIntent
  • 在 C/C++ 中, char* arrayName[][] 是指向指针的指针还是指向指针的指针?

    我将多维数组理解为指向指针的指针 但也许我错了 例如 我认为 char var char var char var char var or char var char var char var or char var or char var