【问题标题】:2D array manipulation using a pointer in C使用 C 中的指针进行二维数组操作
【发布时间】:2011-10-31 00:46:51
【问题描述】:

假设我有一个操作二维数组的函数,它从主函数接收指向二维数组的指针作为其参数。

现在,我想修改(假设每个元素加 10)二维数组的每个元素。

我有兴趣了解使用给我的单个指针遍历二维数组并返回新修改数组的指针。

粗略结构

假设指针a包含二维数组的初始地址。

int add_10(int *a)
{
    int i, j,
        b[M][N] = {0};

    for(i = 0; i < M; i++)
        for(j = 0; j < N; j++)
            b[i][j] = 10 + a[i][j];
}

【问题讨论】:

  • 尝试在堆栈溢出时搜索“二维数组 c”。你可能找到一些答案。
  • 这取决于你是否有指向数组的指针(int (*a)[N])),或者指向 int 的指针(int**);你必须相应地声明你的函数。不过,a[i][j] 的语法在这两种情况下是相同的。

标签: c arrays pointers 2d


【解决方案1】:
int* add_10(const int *dest,
            const int *src,
            const int M,
            const int N)
{
    int *idest = dest;

    memmove(dest, src, M * N * sizeof(int));

    for(int i = 0; i < (M * N); ++i)
        *idest++ += 10;

    return dest;
}

【讨论】:

  • 如果他使用的是二维数组或指向数组类型的指针,而不是数组数组,则会中断。
  • @Dave ...*(*(dest + i) + j) = 10 + *(*(source + i) + j); 更好吗?我会认为这两个版本都是正确的。
  • 不,您使用的是完全不同的类型。 int k[5][5] 是 25 个整数的连续块。它不是数组数组。
  • 没有任何功能可以保证两者都适用;但是操作员询问了二维数组。
  • @Dave So...这样更好吗? :)
猜你喜欢
  • 2012-03-23
  • 2018-01-04
  • 2015-10-28
  • 2017-04-26
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多