在C++中,如何使用指向中间元素的指针来访问奇数大小的二维动态数组的所有元素?[关闭]

fcy6dtqo  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(254)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question
我有一个2D奇数大小的动态数组,我把指向该数组中间元素的指针交给一个函数,在这个函数中我需要访问所有元素。要做到这一点,我引用中间行的第一个元素并对其进行算术运算。不知何故,我没有设法做到这一点与下面的代码。

void spiral(int *center, int odd_size)
 {
  
     int * first_elem = center-odd_size/2;
     *first_elem =6;
     int ** newline = &first_elem;
     *(*(newline+1)+2) = 1;
}
njthzxwz

njthzxwz1#

假设你的矩阵是:

  • 正方形(由odd_size x odd_size数量的元素组成)
  • odd_size实际上是奇数(例如,一、三、五、七、九、十一... 999)
  • 最初分配为单个连续数组,而不是一系列分配到另一个数组中。即matrix = new int[odd_size*odd_size]matrix = malloc(odd_size*odd_size*sizeof(int)),或者可能在堆栈上作为int matrix[odd_size][odd_size]
  • center指向2D矩阵的中间元素

那么第一行上第一个元素的地址将是:

int* matrix = center - (odd_size*odd_size)/2;

第N行的后续地址计算为:

int* row = matrix + odd_size*N;

其中O <= N < odd_size
访问给定行的任何单个元素很简单:

row[C] = value;
value = row[C];

其中0 <= C < odd_size
或者更一般地,为了访问矩阵的任何单独的行、列:

int* matrix = center - (odd_size*odd_size)/2;

int value = matrix[row*odd_size + column];

如果每个矩阵行都是独立分配的,那么所有的赌注都是无效的。
如果odd_size>= SQRT(MAX_INT)或大于46340,则在计算odd_size*odd_size/2时可能出现溢出。在32位体系结构上,您已经接近内存不足了。如果你的矩阵会变得那么大,请确保你考虑到了这一点:

auto total_allocation = odd_size * (intptr_t)odd_size;
int* matrix = center - total_allocation/2;

其中intptr_t通常是从#include <stdint.h>得到的。或者使用long long作为强制转换。

相关问题