创建指向二维数组的指针

2024-01-08

我需要一个指向静态二维数组的指针。这是怎么做到的?

static uint8_t l_matrix[10][20];

void test(){
   uint8_t **matrix_ptr = l_matrix; //wrong idea 
}

我收到各种错误,例如:

  • 警告:来自不兼容指针类型的赋值
  • 下标值既不是数组也不是指针
  • 错误:灵活数组成员的使用无效

这里你想创建一个指向数组第一个元素的指针

uint8_t (*matrix_ptr)[20] = l_matrix;

使用 typedef,这看起来更干净

typedef uint8_t array_of_20_uint8_t[20];
array_of_20_uint8_t *matrix_ptr = l_matrix;

然后你就可以再次享受生活了:)

matrix_ptr[0][1] = ...;

当心指针/数组世界 https://stackoverflow.com/questions/274865/pointer-question-in-c/274943#274943在 C 语言中,围绕这一点有很多混乱。


Edit

在这里查看一些其他答案,因为评论字段太短,无法在那里进行。提出了多种替代方案,但没有显示它们的行为方式。他们是这样做的

uint8_t (*matrix_ptr)[][20] = l_matrix;

如果您修复错误并添加地址运算符&就像下面的代码片段一样

uint8_t (*matrix_ptr)[][20] = &l_matrix;

然后,它创建一个指向 20 uint8_t 数组类型元素的不完整数组类型的指针。因为指针指向数组的数组,所以必须使用

(*matrix_ptr)[0][1] = ...;

因为它是一个指向不完整数组的指针,所以你cannot作为捷径做

matrix_ptr[0][0][1] = ...;

因为索引需要知道元素类型的大小(索引意味着向指针添加一个整数,因此它不适用于不完整的类型)。请注意,这仅适用于C, 因为T[] and T[N]是兼容类型。 C++没有这个概念兼容类型,所以它会拒绝该代码,因为T[] and T[10]是不同的类型。


下面的替代方法根本不起作用,因为当您将数组视为一维数组时,数组的元素类型是not uint8_t, but uint8_t[20]

uint8_t *matrix_ptr = l_matrix; // fail

以下是一个不错的选择

uint8_t (*matrix_ptr)[10][20] = &l_matrix;

您可以通过以下方式访问它

(*matrix_ptr)[0][1] = ...;
matrix_ptr[0][0][1] = ...; // also possible now

它的优点是保留外部尺寸的大小。所以你可以对其应用 sizeof

sizeof (*matrix_ptr) == sizeof(uint8_t) * 10 * 20

还有另一个答案利用了数组中的项目是连续存储的这一事实

uint8_t *matrix_ptr = l_matrix[0];

现在,形式上只允许您访问二维数组的第一个元素的元素。即,满足以下条件

matrix_ptr[0] = ...; // valid
matrix_ptr[19] = ...; // valid

matrix_ptr[20] = ...; // undefined behavior
matrix_ptr[10*20-1] = ...; // undefined behavior

你会注意到它可能工作到10*20-1,但是如果您进行别名分析和其他积极的优化,某些编译器可能会做出可能破坏该代码的假设。话虽如此,我从未遇到过失败的编译器(但话又说回来,我没有在实际代码中使用该技术),甚至 C FAQ 也包含该技术(带有关于其 UB'ness 的警告) ),如果您无法更改数组类型,这是拯救您的最后一个选项:)

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

创建指向二维数组的指针 的相关文章

  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • 从c# 连接到oracle

    我正在尝试从 C 连接 Oracle 11g 我已关注 此链接 定义了连接别名 如下所示 moviess DESCRIPTION ADDRESS PROTOCOL TCP HOST localhost PORT 1521 CONNECT D
  • Entity Framework 4.1 Fluent API 中具有联接表和可选关系的一对多

    再次使用无法更改的旧数据库 并使用 Entity Framework 4 1 和 Fluent API 仅读取数据 public class Client Key public int ClientID get set public str
  • 如何 Dockerize Windows 应用程序

    我有一个 Windows 应用程序 我想将其容器化 它是一个 Windows 桌面应用程序 不是 Web 应用程序 我做了一些搜索 发现关于容器化桌面应用程序的信息很少 我想要容器化的应用程序在 WindowsServerCore 上运行良
  • Angular4 更改 md 按钮的波纹颜色

    我使用 Material for Angular4 在网页中创建了一个 md 按钮 有没有办法改变波纹效果的颜色并使其变为白色 我还可以更改其他波纹属性 例如波纹效果的持续时间吗 事实证明 为了更改波纹属性 应该在 mat ripple t
  • BehaviourSubject 初始值不适用于 share()

    share 运算符应用于BehaviorSubject BehaviourSubject 有初始值 目标是创建单个共享订阅 但是当BehaviorSubject有初始值时 这种共享订阅似乎不起作用 得到意想不到的结果 代码如下所示 let
  • 使用我自己的实体而不是 POCO 实体

    我正在使用实体框架 我可以使用自己的实体来代替 POCO 实体吗 我可以使用任何实体 或者实体名称和成员有任何限制吗 如果实体的成员与字段的名称不同 如何在 db 字段与实体的成员本身之间映射 UPDATE我已经拥有数据库广告一个大型项目
  • 将函数放入对象中与对其进行原型设计之间有什么区别?

    向对象添加函数和将函数原型化到对象上有什么区别 原型设计允许对象 模型调用自身吗 函数对象 通常用于对一组函数进行 命名空间 以便一个容器对象具有许多方法而不是许多全局函数 这样做的好处是保持代码组件按对象 可能还有对象层次结构 进行分类或
  • 三个值的中值

    我正在尝试编写一个 C 程序 它接受 3 个值作为函数参数并返回中位数 该程序运行得很好 直到我意识到它不能使用相同的值两次或更多次 例如 如果输入是 1 2 3 我得到 2 正确的中位数 但如果输入是 1 2 1 或 1 1 1 循环从头
  • 如何将列表转换为以索引作为值的字典?

    我正在尝试转换以下列表 l A B C 对于像这样的字典 d A 0 B 1 C 2 我尝试过其他帖子的答案 但没有一个对我有用 我现在有以下代码 d l i i for i in range len l 这给了我这个错误 unhashab
  • 检查类型是否可为 Null 的正确方法[重复]

    这个问题在这里已经有答案了 为了检查是否Type propertyType 可以为空 我正在使用 bool isNullable Nullable 1 Equals propertyType Name 有什么方法可以避免使用魔术字符串吗 绝
  • 当我的 JAR 位于类路径中时,为什么 Ant 会说“NoClassDefFound”?

    我正在使用 Java 1 6 Eclipse 和 Ant 以下是我创建 jar 文件并运行它的目标
  • 使用 scrapy 与 javascript __doPostBack 方法时出现问题

    尝试自动从公共搜索中抓取搜索结果 但遇到了一些麻烦 URL 的形式为 http www website com search aspx keyword page 1 sort Sorting 当我点击页面时 访问此页面后 它会略有变化 ht
  • 角度4,如何传递提供者实例

    我有一个 Mqtt 服务 我可以从中获取一些实时数据 几何和温度 Mqtt 服务 import Injectable from angular core import Paho from Own paho sript geomqttws31
  • 两个独立数据帧的距离矩阵

    我想创建一个矩阵 其中包含一个数据帧的行与另一个数据帧的行的欧几里德距离 例如 假设我有以下数据框 a lt c 1 2 3 4 5 b lt c 5 4 3 2 1 c lt c 5 4 1 2 3 df1 lt data frame a
  • Webdriver 支持 Python 的 pagefactory 吗?

    我正在读关于页面对象 http code google com p selenium wiki PageObjects和 Webdriver 项目网站上的设计模式 并遇到了页面工厂 http code google com p seleni
  • 使用 Web API 和 RavenDB 进行继承的自定义模型绑定器

    我正在开发一个简单的网络应用程序 我需要绑定特定类型的所有类型实现和接口 我的界面有一个像这样的属性 public interface IContent string Id get set 使用此接口的常见类如下所示 public clas
  • 计算机上的防火墙是否仅阻止来自计算机外部或计算机上进程的内容?

    计算机上运行的防火墙是否仅阻止来自该计算机外部的内容 或者它们是否阻止通过端口进行通信的计算机上的进程之间的通信 具体来说 我正在编写一个 Windows 服务 它将为计算机上的其他进程公开 http RESTful 服务 该服务将运行在非
  • Request.getAttribute("javax.servlet.request.X509Certificate") 返回 Null

    我遇到了 Request getAttribute javax servlet request X509Certificate 在客户端证书身份验证期间为某些用户返回 NULL 以及为其他用户返回有效证书的问题 对于失败的用户 如果我们删除
  • Python:引发 argparse.ArgumentError 后,argparse 引发一般错误

    我为需要遵循精确格式的参数定义了一个自定义正则表达式类型 我使用了另一篇文章中的代码 正则表达式自定义类型 https groups google com forum fromgroups topic argparse users tAC1
  • 创建指向二维数组的指针

    我需要一个指向静态二维数组的指针 这是怎么做到的 static uint8 t l matrix 10 20 void test uint8 t matrix ptr l matrix wrong idea 我收到各种错误 例如 警告 来自