【问题标题】:Defining 2D array using pointers with adjacent memory使用具有相邻内存的指针定义二维数组
【发布时间】:2013-07-12 09:03:15
【问题描述】:

我想过做

int arr[row][col];

但我想因为我要将整个 arr 多次传递给函数,因此它可能会给我 stackoverflow [因为 ROW 和 COL 可能是几千个]。因此,如果我使用指针来代替,那么传递指针将是一种更好的方法,因为我还打算在数组通过各种函数时更改数组的值。

如何使用指针定义数组以及如何将其传递给函数?只要我想访问一个元素,就打算做 arr[i][j]。

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

当您将数组作为参数传递时,您只传递指向其第一个元素的指针,而不是整个数组。

所以函数签名可能看起来像这样:

void some_function(int arr[][col]);

或可选

void some_function(int (*arr)[col]);

如果列大小不是全局编译时常量,那么您也可以将其作为参数传递给函数:

void some_function(const size_t col, int arr[][col]);

或者

void some_function(const size_t col, int (*arr)[col]);

【讨论】:

  • 这只会将 arr 指针放在带有消息调用的堆栈上,而不是整个数组?
  • OP 也想通过各种函数来改变数组的值。所以我猜它应该是指向指针的指针,而不仅仅是指针。
  • @Kraken 没错,数组在传递时会衰减为指针,因此只会传递指针,而不是完整的(或部分)数组。
  • @Dayalrai 指向指针的指针和一个或多个数组(或指向数组的指针)是两个非常不同的东西,不兼容。参见例如this answer of mine 为什么。
  • @JoachimPileborg 如果我这样做void hello(int arr[ROW][COLUMN]) 并将hello(arr) 传递给这个数组,其中arr 是一个大小为10000*10000 的数组。还是只复制指针?
【解决方案2】:

将数组传递给函数是可以的。数组作为参数传递时被视为指针,即只复制第一个元素的地址。

但请务必将行数和列数也作为参数传递。

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多