相关疑难解决方法(0)

如何在C中的函数中传递2D数组(矩阵)?

我需要这样做才能在矩阵上持续操作.这是否意味着它需要通过引用传递?

这还够吗?

void operate_on_matrix(char matrix[][20]);

c parameter-passing multidimensional-array

50
推荐指数
3
解决办法
18万
查看次数

C/C++多维数组内部

我有一个关于C/C++如何在内部存储使用符号声明的多维数组的问题foo[m][n].我不是在质疑指针的纯指针等等......因为速度原因,我在问...

如果我错了,请纠正我,但语法上foo是一个指针数组,它们本身指向一个数组

int foo[5][4]
*(foo + i)           // returns a memory address
*( *(foo + i) + j)    // returns an int
Run Code Online (Sandbox Code Playgroud)

我从很多地方听说过C/C++编译器foo[m][n]在幕后转换为一维数组(计算所需的一维索引i * width + j).但是如果这是真的那么以下就可以了

*(foo + 1)          // should return element foo[0][1]
Run Code Online (Sandbox Code Playgroud)

因此我的问题foo[m][n]是:(总是吗?)存储在内存中作为平面一维数组是真的吗?如果是这样,为什么上面的代码如图所示.

c

22
推荐指数
3
解决办法
1万
查看次数

用平坦的记忆结构替换矢量矢量

我有以下类型:

std::vector<std::vector<int>> indicies
Run Code Online (Sandbox Code Playgroud)

其中内部向量的大小始终为2.问题是,向量在内存中是非连续的.我想用连续的东西替换内部向量,以便我可以抛出扁平数组:

int *array_a = (int *) &(a[0][0])
Run Code Online (Sandbox Code Playgroud)

如果新类型有[]运算符会很好,所以我不必更改整个代码.(如果有必要,我也可以自己实施).我的想法是:

std::vector<std::array<int, 2>>
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<std::pair<int, int>>
Run Code Online (Sandbox Code Playgroud)

这些在内存中看起来如何?我写了一个小测试:

#include <iostream>
#include <array>
#include <vector>
int main(int argc, char *argv[])
{
    using namespace std;

    vector<array<int, 2>> a(100);

    cout << sizeof(array<int, 2>) << endl;

    for(auto i = 0; i < 10; i++){
        for(auto j = 0; j < 2; j++){
            cout << "a[" << i << "][" << j << "] " 
                <<&(a[i][j]) << endl;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这导致:

8
a[0][0] …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector c++11

11
推荐指数
1
解决办法
882
查看次数

是否可以保证以大小为N * M的一维数组访问2D数组(T [N] [M])?

我可以确定以下代码可以工作吗?

int sum_array(int *array, size_t size)
{
  int i;
  int sum = 0;
  for (i=0;i<size;i++)
    sum += *(array+i);
  return sum;
}

int main()
{
  int two_d_array[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
  int sum = sum_array(&two_d_array[0][0], 12);
  printf("%d", sum);
}
Run Code Online (Sandbox Code Playgroud)

虽然将4 x 3数组完全像12个元素的数组那样布置在内存中是合理的,但是可以保证吗?由于我似乎在欺骗类型系统,因此我不确定会出问题(例如,将填充添加到int [3])。

如果您可以详细说明如果我在数组中使用int以外的东西会发生什么,并提供标准的相关报价,则可以加分。

c++ multidimensional-array language-lawyer c++11

8
推荐指数
1
解决办法
295
查看次数

传递2d数组函数时单指针和双指针有什么区别?

我们可以将2d数组作为单个指针传递,也可以传递双指针.但在第二种情况下,输出不如预期.那么第二个代码有什么问题?

方法1:

#include <stdio.h>
void print(int *arr, int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));
}

int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int m = 3, n = 3;
    print((int *)arr, m, n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

方法2:

#include <stdio.h>
void …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers function

3
推荐指数
1
解决办法
271
查看次数