C 中指向二维数组的指针

2024-01-11

我知道有几个关于提供良好(和有效)解决方案的问题,但恕我直言,没有一个问题清楚地说明实现这一目标的最佳方法是什么。 所以,假设我们有一些二维数组:

int tab1[100][280];

我们想要创建一个指向这个二维数组的指针。 为了实现这一目标,我们可以这样做:

int (*pointer)[280]; // pointer creation
pointer = tab1; //assignation
pointer[5][12] = 517; // use
int myint = pointer[5][12]; // use

或者,或者:

int (*pointer)[100][280]; // pointer creation
pointer = &tab1; //assignation
(*pointer)[5][12] = 517; // use
int myint = (*pointer)[5][12]; // use 

好吧,两者似乎都运作良好。现在我想知道:

  • 最好的方法是什么,第一个还是第二个?
  • 对于编译器来说两者相等吗? (速度、性能...)
  • 这些解决方案之一是否比另一个解决方案占用更多内存?
  • 开发者最常用的是什么?

//defines an array of 280 pointers (1120 or 2240 bytes)
int  *pointer1 [280];

//defines a pointer (4 or 8 bytes depending on 32/64 bits platform)
int (*pointer2)[280];      //pointer to an array of 280 integers
int (*pointer3)[100][280]; //pointer to an 2D array of 100*280 integers

Using pointer2 or pointer3产生相同的二进制文件,除了操作之外++pointer2正如所指出的瓦兹克雷格 https://stackoverflow.com/users/1322972.

我建议使用typedef(产生与上面相同的二进制代码pointer3)

typedef int myType[100][280];
myType *pointer3;

Note:从 C++11 开始,您还可以使用关键字using代替typedef

using myType = int[100][280];
myType *pointer3;

在你的例子中:

myType *pointer;                // pointer creation
pointer = &tab1;                // assignation
(*pointer)[5][12] = 517;        // set (write)
int myint = (*pointer)[5][12];  // get (read)

Note:如果数组tab1在函数体内使用 => 该数组将被放置在调用堆栈内存中。但堆栈大小是有限的。使用大于可用内存堆栈的数组会产生堆栈溢出 crash https://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables.

完整的代码片段可在线编译gcc.godbolt.org http://goo.gl/spzzLb

int main()
{
    //defines an array of 280 pointers (1120 or 2240 bytes)
    int  *pointer1 [280];
    static_assert( sizeof(pointer1) == 2240, "" );

    //defines a pointer (4 or 8 bytes depending on 32/64 bits platform)
    int (*pointer2)[280];      //pointer to an array of 280 integers
    int (*pointer3)[100][280]; //pointer to an 2D array of 100*280 integers  
    static_assert( sizeof(pointer2) == 8, "" );
    static_assert( sizeof(pointer3) == 8, "" );

    // Use 'typedef' (or 'using' if you use a modern C++ compiler)
    typedef int myType[100][280];
    //using myType = int[100][280];

    int tab1[100][280];

    myType *pointer;                // pointer creation
    pointer = &tab1;                // assignation
    (*pointer)[5][12] = 517;        // set (write)
    int myint = (*pointer)[5][12];  // get (read)

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

C 中指向二维数组的指针 的相关文章

随机推荐

  • UIView 越界时隐藏子视图

    我有一个视图 比如说 100x100 它有一组 uiviews 作为子视图 假设 30x30 如果子视图具有左上角坐标 90 90 我希望只能看到该子视图的一部分 但我仍然可以看到整个区域 即使它超出了父母的范围 问题是如何使 uiview
  • 显示 Silverlight 的组合框组标题

    我想展示一个ComboBox with OPTGROUPSilverlight 中的样式标头分组 我找到的每个网站 包括有关 SO 的问题 都解决了此链接到过时链接的问题 并且轻松地没有显示可供我使用的代码片段 E g 那么我该怎么做呢 看
  • InstallReferrerClient.startConnection() 抛出错误

    我的一些用户在使用 InstallReferrerClient startConnection 时收到以下错误 我正在跟进android 开发者教程 https android developers googleblog com 2017
  • 如何使用实体框架仅更新一个字段?

    这是表格 Users UserId UserName Password EmailAddress 和代码 public void ChangePassword int userId string password code to updat
  • SQL Server 数据库字段处理韩文和中文字符

    SQL Server中是否有可能有一个字段可以存储中文 韩文和欧洲字符 我的汉字就变成了 数据类型是NVARCHAR以及 NVARCHAR是正确的类型 它将所有内容存储在 2 字节 Unicode 中 与您合作时需要注意的是NVARCHAR
  • Oracle SQL 语句动态模式变量

    我有数百行代码来创建表 但模式名称是硬编码的 如所有 DDL 语句中的 SCHEMA NAME1 TABLE NAME 我怎样才能将其作为变量并在所有地方使用 以便我们可以轻松地在一个地方更改 SCHEMA NAME 要求的多个位置 请给出
  • jquery 模式对话框 onclick?

    我要这个 http jqueryui com demos dialog modal message http jqueryui com demos dialog modal message 当您单击 ClickMe 时发生 这个怎么做 di
  • Firebase 数据库和应用本地化

    我正在为 iOS 和 Android 平台构建一个问答游戏 我希望能够处理本地化 我正在使用 Firebase 的实时数据库解决方案来解决游戏中存在的所有问题 我将问题硬编码到 Firebase 的数据库中 每个问题对象都有 2 个参数 I
  • 基于多个切片器值 Power BI 显示用户计数

    我正在研究一个Viewership table它告诉客户手表资产的数量 有两个资产过滤器 一种用于观看 另一种用于未观看 根据资产过滤器 我需要显示观看节目的客户数量和未观看节目的客户数量 下面是我用过的方法 首先 创建一个新表 Asset
  • 用 Fortran 编写矩阵

    我需要用 FORTRAN 输出一个矩阵 我有一个计算值的工作代码 但我得到的不是矩阵 而是一列 矩阵很大 ixj 2000x2000 这是我的示例代码 open 19 file results1 txt status old positio
  • firestore 是否已删除单个文档每秒写入 1 次的软限制?

    Firestore 始终对单个文档有每秒 1 次写入的软限制 这意味着 对于诸如每秒更新一次以上的计数器之类的事情 推荐的解决方案是分片计数器 看着Firestore 限制文档 https firebase google com docs
  • 使用 ASP.NET MVC 上传图像

    我需要上传图像作为 MVC 应用程序中创建操作的一部分 图像将存储在文件服务器中 数据库将包含该图像的路径 我计划使用以下标签来获取文件 gt
  • 如何将 2 个图像附加到布局底部

    我想附上2张图片 第一个位于左下角 其他位于右下角 但我希望这些图像在底部是核心的 这样如果我滚动页面 图像应该保留在同一位置 动态地 我成功地回答了我自己的问题 所以我特此为所有用户提供代码 它可以工作 所以拥有代码并享受 LinearL
  • Ionic 2 - Angular 2 http 标头未随请求一起发送

    我正在使用 Ionic 的最新测试版本 并且我已经为我的 api 服务器完成了 http post 方法 但标头不会随请求一起发送 我使用的代码如下 Ionic 版本 Beta 8 和 Angular 版本 rc 3 import Page
  • 将 UTF-8 字符串拆分为块

    我想将 UTF 8 字符串拆分为大小相等的块 我想出了一个解决方案 正是这样做的 现在我想简化它 如果可能的话 删除第一个收集调用 有办法做到吗 fn main let strings chars collect
  • Flask 中 return render_template 和 jinja 模板之间的区别

    我见过两种在 Flask 中路由 HTML 页面的方法 要么像这样声明一个名为 template 的变量 def home template jinja env get template hello form html return tem
  • 严格模式下不允许使用八进制文字

    我正在使用 Angular 2 当我在 SCSS 文件中使用它时 效果很好 text after content 00a0 00a0 然而 当我把它搬进去时 styles 表明 未捕获的语法错误 严格模式下不允许使用八进制文字 我知道代码s
  • 从数组 javascript 中删除元素(相反交集)

    昨天晚上我提出了这个问题从数组javascript中删除元素 https stackoverflow com questions 29711165 delete elements from array javascript但我错误地认为 我
  • 渲染与部分渲染和良率之间的差异

    我已经从 Rails 指南中读到了它 已经看过 Micheal Hartel 的书 现在又从 Rails View 的书中读到了它 但我仍然感到困惑 有一个 footer html erb文件 因此它是一个 部分 并且在它编写的代码中 所以
  • C 中指向二维数组的指针

    我知道有几个关于提供良好 和有效 解决方案的问题 但恕我直言 没有一个问题清楚地说明实现这一目标的最佳方法是什么 所以 假设我们有一些二维数组 int tab1 100 280 我们想要创建一个指向这个二维数组的指针 为了实现这一目标 我们